|
|
1
1
在程序集/机器代码级别,虚拟函数通常实现为特定于类的函数指针表(称为虚拟调度表或VDT),这些类型的每个对象都有一个指向其类表的指针。这些表的布局在基类和派生类之间是一致的,因此给定一个指向继承结构中任何对象的指针,任何给定虚拟函数的函数指针在所有类的VDT中始终处于相同的位置。这意味着相同的机器代码可以获取对象指针并找到要调用的函数。 与您所演示的基于开关的代码类型的区别在于,所有带有此类开关的代码都需要手动更新和重新编译,以支持更多类型。使用函数指针,新类型的新代码可以简单地链接到通过指针工作的现有代码,而无需更改或重新编译后者。
首先,您试图定义多态性与C++术语不一致。您有:
在C++中,如果说任何给定的类都有一种形式,并且继承继承权中的不同类可能有不同的形式/操作/属性,那么这更接近事实。 向前在机器代码级别,您可以使用函数指针,并获得与虚拟函数相同的运行时效果,这显然是因为C++必须输出机器代码。 虚拟函数增加的是让编译器为您完成大部分工作的方便性和可靠性:
这种保证和编译器生成的操作使得C++风格的虚拟函数和调度比程序员协调使用函数指针更高级的语言特性,更不用说切换运行时类型了。也就是说,没有什么特别能阻止某人向汇编语言添加这样的支持。也就是说,许多比C++更高级的语言缺少类似于虚拟函数的东西。(在极端情况下 5GL 甚至可能不会向“程序员”/用户公开函数的概念)。 |
|
|
Eris · 纯虚拟成员有什么优势吗(除了他们可能防止的人为错误)? 3 年前 |
|
|
logonmanish · 虚拟com端口在Android上不工作 8 年前 |
|
|
AliS · 使用具有抽象基类指针的映射并调用派生类函数 9 年前 |
|
|
Philip Borgström · Java虚拟游戏板 10 年前 |
|
|
prestokeys · 具有完全可维护性的多重调度解决方案 10 年前 |
|
|
Nick_K · RTSP流到Windows 8上的虚拟视频设备 10 年前 |
|
|
Jay · 基于子类的属性对linq列表排序 11 年前 |
|
|
JLuc5 · C++父类,在两个不同的子类中实现了虚拟方法 11 年前 |