c++ primer plus阅读笔记14---虚基类

来源:互联网 发布:超声波驱狗器 知乎 编辑:程序博客网 时间:2024/05/21 17:55

虚基类
我们来看一个例子:

class work{    ...};class singer:public work{    ...};class waiter:public work{    ...};class singer_waiter:public singer,public waiter{    ...};

上面的代码中,基类(爷爷)派生了两个子类(父亲),singer_waiter(孙子)继承了两个子类,下面的这个代码中,基类的指针应该指向哪儿?

work *w=new singer_waiter();//这种赋值通常把基类指针指向派生类中基类对象的地址,但是singer_waiter对象中有两个基类(work)对象,所以这个指针到底指向哪个基类对象含糊不清,内存图如下:

这里写图片描述
为了解决多重继承中的这个问题,引入了虚基类,我们来看代码:

#include <iostream>using namespace std;class grand_farther{public:    int flag;    grand_farther()    {        flag=1;        cout<<"Grandfarther flag="<<flag<<endl;    }};class father1:virtual public grand_farther //继承父类(爷爷)的时候引入关键字virtual{public:    father1()    {        flag=2;        cout<<"father1 flag="<<flag<<endl;    }};class father2:virtual public  grand_farther //继承父类(爷爷)的时候引入关键字virtual{public:    father2()    {        flag=3;        cout<<"father2 flag="<<flag<<endl;    }};class Son:public father1,public father2{};int main(){    Son *son=new Son();    std::cout<<son->flag<<std::endl;    return 0;}

打印结果;

Grandfarther flag=1father1 flag=2father2 flag=33

此时在son对象中只存在一份基类(爷爷)的拷贝。