钻石继承实例代码
#include <iostream> using namespace std; class BB { public: int bb_; }; class B1 : virtual public BB { public: int b1_; }; class B2 : virtual public BB { public: int b2_; }; class CC : public B1, public B2 { public: int cc_; }; int main() { return 0; }
内存模型
在代码中定义一个
B1 b1;
对象是,会在编译阶段分配相应的内存,b1的第一个部分存放的虚基类表指针,虚基类表指针指向虚基类表。虚基类表中存放着2个数据成员,1. 本类地址与虚基类表指针地址的差 2.虚基类地址与虚基类指针地址的差。(一般来讲,C++编译器会将虚基类数据成员放在一个对象内存的最后)。通过指针访问虚基类成员的时候,根据虚基类表中的存放数据得出偏移量,访问继承得到的虚基类成员。