zoukankan      html  css  js  c++  java
  • 虚继承

    图例,典型菱形虚继承。

    内存布局:

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

  • 相关阅读:
    vue动态改变样式
    前端上传到七牛云图片
    vue实现发送验证码60秒
    移动端使用lib-flexible
    作用域插槽
    vue中的keep-alive
    vue优化
    vue动画move的实现
    vue自带的动画效果
    v-model的理解
  • 原文地址:https://www.cnblogs.com/dirichlet/p/3221833.html
Copyright © 2011-2022 走看看