我试着用谷歌搜索它,但没有找到任何结果。该实现是否类似于 C 中使用函数指针和数据结构的类 hack?还是以另一种形式实现?
我没有编写任何c++编译器,但是类的结构应该包含:
注意:非虚函数是静态引用的,因此它们不应该直接绑定到类实例。
也就是说,每个编译器的实现方式可能略有不同。
TLDR:本质上是的,实现必须类似于类 hack(但这对于开发人员来说应该是透明的/无关的)。
编辑:
这篇文章主要是猜测,基于多年使用 Visual Studio 进行的调试(非常主观),并以多年前的一些经验为后盾,维护一个具有支持继承的类 hack 的项目,用 C 实现(这样的经验也非常主观)。
例如,在 Visual Studio 6 中,您可以看到虚拟函数表是在 C++ 实现特定数据之前分配的。也就是说,一个类看起来像这样:
[vtbl][data]
^1 ^2
Run Code Online (Sandbox Code Playgroud)
所以如果这是为了(例如)struct X { virtual ~X(); int i; },那么写:
X a;
X *p = &a;
Run Code Online (Sandbox Code Playgroud)
会创建类似的东西:
[ptr + 1] -> any other virtual functions
[ptr + 0] -> X::~X
^x
[^x][data]
^1 ^2
^p = ^2;
Run Code Online (Sandbox Code Playgroud)
如果^1是操作系统分配内存的位置(并且 vtbl 将在 的实现中填充new),则用户数据的偏移量 ( vtbl + sizeof (vtbl)) 将作为类的地址返回给客户端代码。我不知道现在是否仍然如此。