抽象類和介面
什麼是抽象類
比如圖形(shape)類, 就是乙個抽象的概念,因為我們無法計算這個「圖形」的面積,所以它的成員函式area()是空的。
而繼承它的子類(矩形,圓形,三角形等)就可以去重寫area()成員函式. 裡面通過數學公式,計算出面積.
參考圖形(shape)類,**如下:
class既然shape是個抽象的類,那就根本沒有該類的物件,我們該如何避免他人使用shape類建立物件呢?答:shape
};
在c++中,通過純虛函式來避免
純虛函式
純虛函式需要在宣告函式名前面加上virtual,在最後面加個=0;
比如:
class介面當類滿足下面條件,則稱為介面舉個例子比如我們的藍芽,可以開啟,關閉,收發資料shape
;
而網絡卡也一樣,可以開啟,關閉,收發資料.
類似的還有串列埠等等
這些類都擁有同樣的行為,只是內容不同,所以它們的父類channel只需要構造純虛函式,所以便被稱為介面,該父類**如下:
class多重繼承例如:channel;
class derived : public多重繼承的問題1當多個不同的父類指標指向同乙個多重繼承的子類時,可能擁有不同位址比如:basea,
public
baseb,
public
basec
#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為什麼,pa指標和pb指標都指向d物件,它們的位址卻有所不同?這是因為derived d物件位址裡依次存了兩個不同的父類成員變數值,如下圖所示:&d= 0x28fefc
pa= 0x28fefc
pb= 0x28ff00
從上圖看到,其實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可以發現,使用dynamic_cast轉換,判斷出來的位址就是相等的.以p->equal(dynamic_cast(pint1))為例,我們編譯時,編譯器就會去檢查pint1所在的位址,然後找到是d物件,通過d物件找到base父類,從而去修正pint1指標的位址.p->geti() = 40
pint1 == p : 1
pint2 == p : 1
&d== p : 1
多重繼承和多繼承 虛函式 純虛函式 抽象類 介面類
掌握多重繼承和多繼承的區別。多重繼承 即基類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 定義了乙個抽象類的...