虛函式與多繼承

2021-06-18 06:18:15 字數 726 閱讀 8923

問題:假設有兩個基類a和b,它們有乙個相同簽名的虛函式void foo(), 但是擁有不同的實現。現在要求建立乙個新類c,它同時繼承a和b,也有相同的簽名的函式void foo(), 並能分別對a和b中的foo函式進行重寫(overwrite)。

已知條件對應的**如下:

#include

using namespace std;

class a

如果c直接繼承a和b的話,是上述**是很難按照預期工作的,因為c的foo()函式不知道怎麼寫,乙個函式的實現很難完成兩種功能(通過指標型別判定?應該不行)。因此面試時百思不解,回來後才查了下,發現需要引入中間繼承,即採用間接繼承的方式,具體做法如下:

class mida:public a

protected:

private:

};class midb:public b

protected:

private:

};class c:public mida, public midb

{public:

virtual void fooca() {cout<<"c::foo() a"foo()也是類似的。

實際上,讓c直接繼承自a和b,然後定義fooca和foocb虛函式,分別進行實現,然後通過手動修改c的虛函式表,把fooca的位址放到a物件的虛擬表中,把foocb放到b物件的虛擬表中。這樣,不用引入中間類,也能完成任務,只是這種方法寫出的**很難理解,實用性較差。

多繼承與虛函式

include using namespace std enum color class animal virtual int getage virtual void setage int age private int itsage animal animal int age itsage age...

多繼承與虛函式

多繼承 類中protected屬性是指該類中的成員函式可以訪問protected屬性的資料成員,但類物件不可以訪問。而public屬性的資料成員,類的成員函式和類物件都可以訪問。1 公有繼承 2 私有繼承 2 保護繼承 菱形繼承問題 當b c有共同的基類a派生而來,而類d又繼承b和c,這時b,c是d...

C 多繼承與虛繼承

目錄 多繼承與虛繼承以及存在的問題 例子 虛繼承有了多繼承,虛繼承才會有意義 如果有個菱形結構的繼承,爺爺類為a,然後b,c是a的派生類,最後d是b和c的派生類,如果在a中有乙個成員變數a,d去呼叫就會出現訪問不明確,虛繼承就可以解決訪問不明確的這種問題 如果這樣繼承b,c虛繼承了a,virtual...