• c++之菱形继承问题


    昨天面试问了菱形继承的问题,回答的稀巴烂,回来赶快好好学习一波!!!!!

    菱形继承如下图:

    上一段代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    class Base{
    public:
        void fun(){
            cout<<"Base()"<<endl;
        }
    };
    
    class A:public Base{
    
    };
    
    class C:public Base{
    
    };
    
    class D:public A,public C{
    
    
    };
    
    int main(){
        D d;
        //d.fun(); 出错,返回request for member 'fun' is ambiguous
        d.A::fun();
        d.C::fun();
        return 0;
    }

    可以看到,如果不利用域限定需要访问的函数,那么就会出现模糊调用的问题,但是貌似C++给了更好的方法,虚继承!

    #include<bits/stdc++.h>
    using namespace std;
    
    class Base{
    public:
        int _base=1;
        void fun(){
            cout<<"Base()"<<endl;
        }
    };
    
    class A:virtual public Base{
    public:
        int _base=2;
    };
    
    class C:virtual public Base{
    public:
        int _base=3;
    };
    
    class D:public A,public C{
    
    };
    
    int main(){
        D d;
        d.fun();//Base()
        d.A::fun();//Base()
        d.C::fun();//Base()
        cout<<d.Base::_base<<endl;//1
        cout<<d.A::_base<<endl;//2
        cout<<d.C::_base<<endl;//3
        return 0;
    }

    利用虚继承就可以解决菱形继承的问题,具体实现是:A和C中不再保存Base的具体内容,而是保存了一份偏移地址,所以在D调用fun()时,调用的就是Base的fun(),但对于A、C相同的变量名,D在调用时还是要利用域限定来处理。虚继承不同于虚函数,虚函数在C++中主要用于实现多态,具体见虚函数动态绑定和静态绑定

  • 相关阅读:
    iOS开发之窗口和视图
    GCD
    禁止非法用户登录综合设置
    大数减法(C++实现)
    大数加法(C++实现)
    迷宫问题 (BFS ➕输出路径)
    Pots (BFS ➕ 输出路径)
    Shuffle'm Up (map ➕ BFS)
    Prime Path (BFS)
    速算24点
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9641192.html
Copyright © 2020-2023  润新知