C++-带有虚函数的虚拟继承的内存布局是怎样的?

C++-带有虚函数的虚拟继承的内存布局是怎样的?

灵芸 发布于 2017-04-24 字数 549 浏览 1208 回复 1

最近在研究虚继承,对带有虚函数的虚拟继承的内存布局有些疑惑,求大神指点,最好带图的,谢谢!

例如下面的代码:

class A           
{
public:
A(){cout << "A called"<< endl;}

virtual void print(){cout << "A print" <<endl;}

};

class B :public virtual A
{
public:
B(){cout << "B called" << endl;}

void print(){cout << "B print" << endl;}
};

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

晚风撩人 2017-08-15 1 楼

单个的虚继承没有意义,而且它的布局和普通的单继承完全一样。
虚继承主要用于多继承中的菱形继承,举例如下:

class Top
{
public:
int a;
};

class Left : virtual public Top
{
public:
int b;
};

class Right : virtual public Top
{
public:
int c;
};

class Bottom : public Left, public Right
{
public:
int d;
};

它的继承关系图如下:

可以得出 Bottom 的内存结构可能是这样子的。

从图中可以看出,Top 中的数据只保存了一份,也就是说,虚拟继承其实就是共享数据的意思。
但是虚继承的内存结构实际上没有这么简单,它应该是这样子的:

上图有两点值得大家注意。第一点就是类中成员分布顺序是完全不一样的(实际上可以说是正好相反)。第二点,类中增加了vptr指针,这些是被编译器在编译过程中插入到类中的(在设计类时如果使用了虚继承,虚函数都会产生相关vptr)。同时,在类的构造函数中会对相关指针做初始化,这些也是编译器完成的工作。Vptr指针指向了一个“virtual table”。在类中每个虚基类都会存在与之对应的一个vptr指针。

以上有些参考自:多重继承和虚继承的内存布局