虚继承

图例,典型菱形虚继承。

虚继承

内存布局:

虚继承

 虚子类Left, Right在最上,虚基类在最下面,本质是两个虚子类对象的开始部分都含有一个虚指针指向虚表,虚表里有相对于Top的偏移量。

当做Right,Left指针到Top指针的转换时,需要用到这个偏移量。

Right* right;

Left* left;

................

Top* top= right;
Top* top= left;

 

 实例代码: 

#include <iostream>

using namespace std;



class Top 

{

public:

    Top():w(1){}



private:

    int w;

};



class Left : public virtual Top

{

public:

    Left():x(2){}



private:

    int x;

};



class Right : public virtual Top

{

public:

    Right():y(3){}



private:

    int y;

};



class Bottom: public Left, public Right

{

public:

    Bottom():z(4){}



private:

    int z;

};





class Left2

{

public:

    Left2():x(2){}



private:

    int x;

};



class Right2

{

public:

    Right2():y(3){}



private:

    int y;

};



class Bottom2: public Left2, public Right2

{

public:

    Bottom2():z(4){}



private:

    int z;

};





int main()

{

    Bottom * pBottom = new Bottom();

    Right * pRight = pBottom;

    Top * pTop = static_cast<Top *>(pRight);



    Bottom2 * pBottom2 = new Bottom2();

    Right2 * pRight2 = pBottom2;



    return 1;

}

 

 

参考:

多重继承和虚继承的内存布局     http://blog.csdn.net/littlehedgehog/article/details/5442430

RTTI、虚函数和虚基类的实现方式、开销分析及使用指导 http://baiy.cn/doc/cpp/inside_rtti.htm

 

你可能感兴趣的:(继承)