虚继承

图例,典型菱形虚继承。

内存布局:

 虚子类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;
}

问题:这里Top * pTop = static_cast<Top *>(pRight); 是否表明 static_cast就是安全的向上类型转换。

参考:

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

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

原文地址:https://www.cnblogs.com/dirichlet/p/3221833.html