这是对此问题的后续问题。
考虑这个例子:
#include <iostream>
class A
{
};
class B : public A
{
public:
int i;
virtual void Func() = 0;
};
class C : public B
{
public:
char c;
void Func() {}
};
int main()
{
C* pC = new C;
A* pA = (A*)pC;
std::cout << "pC == " << std::hex << pC << "\n";
std::cout << "pA == " << std::hex << pA << "\n";
return 0;
}
使用 Visual Studio 2010,输出是(在我的机器上):
PC == 002DEF90 pA == 002DEF94
(这可以通过问题的公认答案来解释)。
使用 g++,输出为:
PC == 0x96c8008 pA == 0x96c8008
那么,问题来了,g++的实现是如何处理这种情况的呢?C
当应该有一个 vtable时,是什么使地址相同?(我知道这是一个实现细节,不要这么说:)出于好奇,我对这个实现细节感兴趣)。