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++中主要用于实现多态,具体见虚函数动态绑定和静态绑定

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM