C 多繼承中重寫不同基類中相同原型的虛函式

2021-12-29 19:41:07 字數 1453 閱讀 7852

在c++多繼承體系當中,在派生類中可以重寫不同基類中的虛函式。下面就是乙個例子:

[cpp]

class cbasea 

; class cbaseb 

; class cderived : public cbasea, public cbaseb 

; void test() 

可是,如果兩個基類中有乙個相同原型的虛函式,例如下面這樣:

[cpp]

class cbasea 

; class cbaseb 

; 怎樣在派生類中重寫這兩個相同原型的虛函式呢? 也許這種情況並不常見,可是這種情況卻確實存在。比如說開發的時候使用的兩個類庫是不同的廠商提供的,或者說這兩個類庫是由公司的不同開發小組開發的。對前者來說,修改基類的介面是不可能的;對後者來說,修改介面的代價很大。 如果在派生類中直接重寫這個虛函式,那麼2個基類的test()虛函式都將被覆蓋。這樣的話就只能有乙個test()的實現,而不是像前面的例子那樣有不同的實現。

[cpp]

class cderived : public cbasea, public cbaseb 

; void test() 

為了實現第乙個例子中的那樣,在派生類cderived中重寫不同基類中相同原型的虛函式test(),可以使用下面的方法。 首先,不需要對2個基類進行任何修改(在實際的開發當中,修改基類的可能性非常小)。

[cpp]

class cbasea 

; class cbaseb 

; 現在,為這個繼承體系新增2個中間類,分別從2個基類派生。

[cpp]

class cmiddlebasea : public cbasea 

}; // 與類cmiddlebasea採用相同的方法 

class cmiddlebaseb : public cbaseb 

}; 然後,類cderived以上面2個中間類作為基類來派生。分別重寫上面2個基類中原型不同的純虛函式,新增不同的實現**。

[cpp]

class cderived : public cmiddlebasea, public cmiddlebaseb 

; void test() 

現在以上面**中的pa->test();這行**來說明上面的方案是怎麼實現的。 首先,由於虛函式test()在類cbasea的派生類cmiddlebasea中被重寫,所以這行**會去呼叫類cmiddlebasea的test()函式; 然後,類cmiddlebasea的test()函式會去呼叫實現函式cbasea_test(); 最後,由於虛函式cbasea_test()在類cmiddlebasea的派生類cderived中被重寫,所以真正呼叫的是類cderived中的cbasea_test()函式。 同樣的道理,**pb->test();實際上呼叫的是類cdervied中的cbaseb_test()函式。 通過上面的方法就可以在c++多繼承中重寫不同基類中相同原型的虛函式。

摘自 開心

C 多繼承中重寫不同基類中相同原型的虛函式

在c 多繼承體系當中,在派生類中可以重寫不同基類中的虛函式。下面就是乙個例子 class cbasea class cbaseb class cderived public cbasea,public cbaseb void test 可是,如果兩個基類中有乙個相同原型的虛函式,例如下面這樣 cla...

C 多繼承中重寫不同基類中相同原型的虛函式

在c 多繼承體系當中,在派生類中可以重寫不同基類中的虛函式。下面就是乙個例子 class cbasea class cbaseb class cderived public cbasea,public cbaseb void test 可是,如果兩個基類中有乙個相同原型的虛函式,例如下面這樣 cla...

C 多繼承中重寫不同基類中相同原型的虛函式

在c 多繼承體系當中,在派生類中可以重寫不同基類中的虛函式。下面就是乙個例子 classcbasea classcbaseb classcderived publiccbasea,publiccbaseb voidtest 可是,如果兩個基類中有乙個相同原型的虛函式,例如下面這樣 classcbas...