这是关于此问题的后续提问:这个问题。
考虑以下例子:
考虑以下例子:
#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
应该有一个虚函数表时,地址相同?(我知道这是一个实现细节,不要说 :) 我出于好奇对这个实现细节感兴趣)。
A
子对象之后吗?一个实现是否可以通过将vptr放在不同的位置来节省一些指针调整/转发开销呢? - wolfgang