考虑下面的代码:虚表的存储位置
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个额外的虚拟表。而这正是Derived类所发生的。
但它似乎也与Derived2的(只从基础1类继承)发生
这里的DD内存映射:
Example1::Base1
__vfptr
[0] 0x00c4127b
这里的B内存映射:
__vfptr
[0] 0x00c411ae
正如你可以看到,第一个虚拟表格插槽的地址是不同的。 例如b和b2具有相同的虚拟表格。
好了,所以现在对于两个问题:
1)为什么他们不共享相同的虚拟基础1表? (Derived2和Base1对象)
2)为什么派生类甚至需要持有n-1个虚拟表? (当N表示派生类继承的类的数量)
谢谢!
btw。这些是实现细节,可能在实现方面有所不同,最好问的可能是制造商,我们在这里大多可能猜到 – PlasmaHH 2013-05-08 09:34:09