给定以下代码:
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 类继承自的类数时)
谢谢!