虛擬繼承的意義 (轉)
在類過載中我們一般使用以下的方式:
class Base
{
void Echo() { printf("Echo from Base");}
};
class Middle : public Base {}
class Child : public Middle {}
可以很清楚的看出過載過程是 Base->Middle->Child.
這樣的結構使用預設的過載方式就可以了.
void main()
{
Child c;
c.Echo(); // 正確.
}
但是在某些時候,我們需要從基類分出若干子類,然後再由子類進行多重繼承,
這個時候以上的方法就會出錯.
比如:
class Base
{
void Echo() { printf("Echo from Base");}
};
class Middle1 : public Base {}
class Middle2 : public Base {}
class Child : public Middle1,Middle2 {}
void main()
{
Child c;
c.Echo(); // 錯誤.不明確.
}
這是因為編譯時認為Middle1和Middle2是兩個類體系
來自不同的Base類(雖然兩個Base宣告一模一樣),所以在呼叫
Base類的Echo時無法確認指向那一個.
解決的方法是使用"虛擬繼承".
如下所示:
class Base
{
void Echo() { printf("Echo from Base");}
};
class Middle1 : virtual public Base {}
class Middle2 : virtual public Base {}
class Child : public Middle1,Middle2 {}
void main()
{
Child c;
c.Echo(); // 正確.函式呼叫來自同一基類.
}
以下圖示更能描述預設繼承和虛擬繼承的區別.
預設繼承:
base base
| |
| |
Mid1 Mid2
| |
|
Child
存在兩個類體系是出錯的原因.
虛擬繼承:
base
|
| |
Mid1 Mid2
| |
|
Child
使用虛擬繼承將類的體系整合起來.
一點學習的,不足之處請指出.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993695/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ protected繼承意義C++繼承
- 菱形繼承,虛繼承繼承
- 虛繼承繼承
- C++ 虛擬函式和虛繼承淺析C++函式繼承
- C++繼承二之虛擬函式C++繼承函式
- C++ 繼承、多型、虛擬函式C++繼承多型函式
- C++單繼承、多繼承情況下的虛擬函式表分析C++繼承函式
- C++虛繼承的概念C++繼承
- 多重繼承及虛繼承中物件記憶體的分佈繼承物件記憶體
- C++繼承三之純虛擬函式pure virtual functionC++繼承函式Function
- c++ 虛繼承詳解C++繼承
- 菱形繼承與虛基類繼承
- JavaScript的繼承-轉載JavaScript繼承
- 虛擬存貯技術在資訊管理中的意義
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- C++中的虛繼承的構造C++繼承
- Spring Bean 定義繼承SpringBean繼承
- 繼承與介面 (轉)繼承
- java 繼承的基礎(轉)Java繼承
- C++ 記憶體分佈之菱形繼承(無虛擬函式)C++記憶體繼承函式
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- PHP模擬多繼承的方式:traitsPHP繼承AI
- VR虛擬現實技術在展館中使用的意義VR
- 三種繼承的方法:public 繼承/private繼承/protected繼承詳解及區別繼承
- 原型,繼承——原型繼承原型繼承
- 白馬非馬----繼承 (轉)繼承
- C++ 派生類函式過載與虛擬函式繼承詳解C++函式繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- 類的繼承_子類繼承父類繼承
- 多繼承 與 多重繼承繼承
- Guru of the Week #5:虛擬函式的重新定義 (轉)函式
- 這樣回答繼承,面試官可能更滿意繼承面試
- c++繼承,隱藏(重定義)C++繼承
- C++繼承詳解:共有(public)繼承,私有(private)繼承,保護(protected)繼承C++繼承
- 利用C#中介面的繼承去模擬銀行的轉帳交易C#繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- 類的繼承繼承