【发布时间】:2013-05-08 09:12:40
【问题描述】:
给定以下代码:
namespace Example1 {
class Base1 {
public:
Base1() {}
virtual ~Base1() {}
protected:
float data_Base1;
};
class Base2 {
public:
Base2() {}
virtual ~Base2() {}
protected:
float data_Base2;
};
class Derived : public Base1, public Base2 {
public:
Derived() {}
virtual ~Derived() {}
protected:
float data_Derived;
};
class Derived2 : public Base1 {
public:
Derived2() {}
virtual ~Derived2() {}
protected:
float data_Derived2;
};
}
int main (void)
{
using namespace Example1;
Base2* pbase2 = new Derived;
Base1* b = new Base1();
Base1* b2 = new Base1();
Derived* d = new Derived;
Derived* d2= new Derived;
Derived2* dd = new Derived2;
}
使用 Visual Studio 2012 的编译器,似乎在多重继承下,派生类包含 n-1 个额外的虚拟表。这正是派生类发生的情况。
但它似乎也发生在 Derived2 (仅继承自 Base1 类)
这里是 dd 内存映射:
Example1::Base1
__vfptr
[0] 0x00c4127b
这是 b 内存映射:
__vfptr
[0] 0x00c411ae
如您所见,第一个虚拟表槽的地址不同.. 例如 b 和 b2 具有相同的虚拟表。
好的,现在回答两个问题:
1) 为什么它们不共享同一个 Base1 虚拟表? (Derived2 和 Base1 对象)
2) 为什么派生类甚至需要保存 n-1 个虚拟表? (当N表示Derived类继承的类数时)
谢谢!
【问题讨论】:
-
顺便说一句。这些是实现细节,可能会因实现而异,最好问的可能是制造商,我们在这里大多可以猜测
标签: c++