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