【发布时间】:2013-08-25 17:02:03
【问题描述】:
我遇到了 C++ 虚拟继承问题。
我有一个类层次结构如下:
class Base
{
public:
virtual void Func(){};
int BaseValue;
};
class Derived : virtual public Base
{
public:
void Func(){};
virtual void Func2(){};
int DerivedValue;
};
编译得很好,但是,我对内存结构有点困惑。
我希望得到sizeof(Derived)==20的结果,即:
- BaseValue 和 DerivedValue--8 字节
- 指针表示基类的成员偏移量 (虚继承特性)--4字节
- 指针表示Base类的虚函数表--4字节
-
指针表示只属于Derived类的虚函数
Func2()--4字节 (就我而言,没有非虚基类并获得其独特虚函数的派生类应该有自己的虚表)
总计 20 个字节;
然而 Xcode 4.6 产生了不同的结果 sizeof(Derived)==16,我弄错了吗?
【问题讨论】:
-
是的,你弄错了。我很困惑,因为您暗示您知道虚函数表是什么,然后在下一句中表明您不知道虚函数表是如何工作的。你认为虚函数表是如何工作的?
-
是的,我想我知道虚函数表是如何工作的,比如说,如果我得到一个 Base 的实例 b,我可以得到 Func() 的地址为 (int*)*(&b) ,
-
这是实现定义的,你应该避免依赖这些信息。例如,一个 int 可能是 2 个字节(有人说是 68k 吗?),指针的大小也可能是其他大小。现在如果你问是因为你想了解 vtable,那是另一回事。
-
你的意思是vtable机制是编译器相关的?还是指针的大小?我假设在 32 位环境中指针是 4 个字节
-
不知道怎么用英文正确表达“very next sentence”,我的意思是一个指针,表示基成员(这里是BaseValue)在内存中的偏移量Derived 类的一个实例
标签: c++ function virtual-inheritance