![]() |
1
1
在程序集/机器代码级别,虚拟函数通常实现为特定于类的函数指针表(称为虚拟调度表或VDT),这些类型的每个对象都有一个指向其类表的指针。这些表的布局在基类和派生类之间是一致的,因此给定一个指向继承结构中任何对象的指针,任何给定虚拟函数的函数指针在所有类的VDT中始终处于相同的位置。这意味着相同的机器代码可以获取对象指针并找到要调用的函数。 与您所演示的基于开关的代码类型的区别在于,所有带有此类开关的代码都需要手动更新和重新编译,以支持更多类型。使用函数指针,新类型的新代码可以简单地链接到通过指针工作的现有代码,而无需更改或重新编译后者。
首先,您试图定义多态性与C++术语不一致。您有:
在C++中,如果说任何给定的类都有一种形式,并且继承继承权中的不同类可能有不同的形式/操作/属性,那么这更接近事实。 向前在机器代码级别,您可以使用函数指针,并获得与虚拟函数相同的运行时效果,这显然是因为C++必须输出机器代码。 虚拟函数增加的是让编译器为您完成大部分工作的方便性和可靠性:
这种保证和编译器生成的操作使得C++风格的虚拟函数和调度比程序员协调使用函数指针更高级的语言特性,更不用说切换运行时类型了。也就是说,没有什么特别能阻止某人向汇编语言添加这样的支持。也就是说,许多比C++更高级的语言缺少类似于虚拟函数的东西。(在极端情况下 5GL 甚至可能不会向“程序员”/用户公开函数的概念)。 |
![]() |
Eris · 纯虚拟成员有什么优势吗(除了他们可能防止的人为错误)? 2 年前 |
|
James Nguyen · Java多态性:为什么返回错误? 7 年前 |
|
Alex Cristea · 如何从另一个类的数组中打印特定行 7 年前 |
![]() |
juztcode · C语言中的静态和动态分辨率++ 7 年前 |
![]() |
Hugo · 具有多态关系的活动记录获取关联模型 7 年前 |
![]() |
pooya13 · 机器代码层上虚函数和条件执行的区别 7 年前 |
![]() |
Nisba · C中子类类型未知的模型类/子类++ 7 年前 |
![]() |
R zu · 使用多次调用的可替换方法初始化 7 年前 |