美文网首页
C++之菱形继承

C++之菱形继承

作者: 二进制人类 | 来源:发表于2022-10-25 08:50 被阅读0次
    class Animal
    {
    public:
        int data;
    };
    
    class horse:public Animal{};
    
    class donkey:public Animal{};
    
    class mule:public horse, public donkey{};
    
    int main(int argc, char *argv[])
    {
        mule ob1;
        //菱形继承容易产生数据和方法的二义性
        //cout<<ob1.data<<endl;//err
    
        //加作用域可以解决
        cout<<"data="<<ob1.horse::data<<endl;
        cout<<"data="<<ob1.donkey::data<<endl;
        return 0;
    }
    

    使用虚继承可以让mule只留一份公共祖先的数据

    class Animal
    {
    public:
        int data;
    };
    
    //虚继承
    class horse: virtual public Animal{};
    //虚继承
    class donkey:virtual public Animal{};
     //mule只有一份data
    class mule: public horse, public donkey{};
    
    int main(int argc, char *argv[])
    {
        mule ob1;
        cout<<ob1.data<<endl;
        return 0;
    }
    

    虚继承原理

    因此在发生虚继承后,马和驴中原先继承下来的age变成了vbptr指针都指向各自的虚函数表,通过各自虚函数表中指针的偏移量找到animal基类中age,避免了菱形继承的二义性

    相关文章

      网友评论

          本文标题:C++之菱形继承

          本文链接:https://www.haomeiwen.com/subject/wxkbzrtx.html