24 C 抽象類 存虛函式 介面 多重繼承

2021-09-07 17:44:02 字數 3388 閱讀 6455

抽象類和介面

什麼是抽象類

比如圖形(shape)類, 就是乙個抽象的概念,因為我們無法計算這個「圖形」的面積,所以它的成員函式area()是空的。

而繼承它的子類(矩形,圓形,三角形等)就可以去重寫area()成員函式. 裡面通過數學公式,計算出面積.

參考圖形(shape)類,**如下:

class

shape

};

既然shape是個抽象的類,那就根本沒有該類的物件,我們該如何避免他人使用shape類建立物件呢?答:

在c++中,通過純虛函式來避免 

純虛函式

純虛函式需要在宣告函式名前面加上virtual,在最後面加個=0;

比如:

class

shape

;

介面當類滿足下面條件,則稱為介面舉個例子比如我們的藍芽,可以開啟,關閉,收發資料

網絡卡也一樣,可以開啟,關閉,收發資料.

類似的還有串列埠等等

這些類都擁有同樣的行為,只是內容不同,所以它們的父類channel只需要構造純虛函式,所以便被稱為介面,該父類**如下:

class

channel;

多重繼承例如:

class derived : public

basea,

public

baseb,

public

basec

多重繼承的問題1多個不同的父類指標指向同乙個多重繼承的子類時,可能擁有不同位址比如:

#include using

namespace

std;

class

basea

intgeta()

};class

baseb

intgetb()

};class derived : public basea, public

baseb

};int

main()

else

cout

<< "

&d=

"<< &d <

cout

<< "

pa=

"<< pa <

cout

<< "

pb=

"<< pb <

}

執行列印:

false

&d= 0x28fefc

pa= 0x28fefc

pb= 0x28ff00

為什麼,pa指標和pb指標都指向d物件,它們的位址卻有所不同?這是因為derived d物件位址裡依次存了兩個不同的父類成員變數值,如下圖所示:

從上圖看到,其實pa和pb還是位於d物件位址裡,只是指向的位置不同而已.所以在多重繼承裡,最好不要使用等號直接判斷兩個指標物件是否相等.

多重繼承的問題2

多重繼承可能產生冗餘的成員

比如:

老師teacher類,學生student類都繼承於people類

有些老師,為了工作還要考博士學位,既是老師又是學生,所以同時繼承於老師teacher類,學生student類,則該類的成員便會擁有兩個people類成員,從而產生冗餘

在工程中,如何正確使用多重繼承

例如:

#include 

using

namespace

std;

class

base

intgeti()

bool equal(base*obj)

};class

inte***ce1

;class

inte***ce2

;class derived : public base, public inte***ce1, public

inte***ce2

void add(int

i)

void minus(int

i)

void multiply(int

i)

void divide(int

i)

}};int

main()

執行列印:

p->geti() = 100

p->geti() = 40

pint1 == p : 1

pint2 == p : 1

&d== p : 1

可以發現,使用dynamic_cast轉換,判斷出來的位址就是相等的.p->equal(dynamic_cast(pint1))為例,我們編譯時,編譯器就會去檢查pint1所在的位址,然後找到是d物件,通過d物件找到base父類,從而去修正pint1指標的位址.

多重繼承和多繼承 虛函式 純虛函式 抽象類 介面類

掌握多重繼承和多繼承的區別。多重繼承 即基類a 派生類b 繼承父類a 派生類c c繼承父類b 這裡說明的是,基類a中的資料成員 前提 公有繼承方式,會被派生類b所繼承,隱式的存放在派生類b的public下,此時派生類c公有繼承父類b,c中則包含從b和a中的公有資料成員和函式。多繼承 舉個例子 基類 ...

C 多型3 純虛函式 抽象類 介面類

沒有函式體並且在定義的時候要在後面加個 0 宣告 virtual 函式型別 函式名 參數列列 0 注意 1 純虛函式沒有函式體 2 最後面的 0 並不表示函式返回值為0,它只起形式上的作用,告訴編譯系統 這是虛函式 3 這是乙個宣告語句,最後有分號。為什麼要引入純虛函式?因為比如說定義乙個人類,人類...

c 抽象類 純虛函式

1 錄入下面程式,分析編譯錯誤資訊。include include include using namespace std class abstract virtual void f 0 int main 分析 這個程式最大的問題就是abstract p new abstract 定義了乙個抽象類的...