#include usingnamespace
std;//線
class
line
;line::line(
float
len):
m_len(len)
//矩形
class rec: public
line
;rec::rec(
float len, float
width):
line(len), m_width(width)
float
rec::area()
//長方體
class cuboid: public
rec;
cuboid::cuboid(
float len, float width, float
height):
rec(len, width), m_height(height)
float
cuboid::area()
float
cuboid::volume()
//正方體
class cube: public
cuboid
;cube::cube(
float
len):
cuboid(len, len, len)
float
cube::area()
float
cube::volume()
intmain()
執行結果:
the area of cuboid is 2200
the volume of cuboid is 6000
the area of cube is 1350
the volume of cube is 3375
本例中定義了四個類,它們的繼承關係為:line --> rec --> cuboid --> cube。
line 是乙個抽象類,也是最頂層的基類,在 line 類中定義了兩個純虛函式 area() 和 volume()。
在 rec 類中,實現了 area() 函式;所謂實現,就是定義了純虛函式的函式體。但這時 rec 仍不能被例項化,因為它沒有實現繼承來的 volume() 函式,volume() 仍然是純虛函式,所以 rec 也仍然是抽象類。
直到 cuboid 類,才實現了 volume() 函式,才是乙個完整的類,才可以被例項化。
可以發現,line 類表示「線」,沒有面積和體積,但它仍然定義了 area() 和 volume() 兩個純虛函式。這樣的用意很明顯:line 類不需要被例項化,但是它為派生類提供了「約束條件」,派生類必須要實現這兩個函式,完成計算面積和體積的功能,否則就不能例項化。
在實際開發中,你可以定義乙個抽象基類,只完成部分功能,未完成的功能交給派生類去實現(誰派生誰實現)。這部分未完成的功能,往往是基類不需要的,或者在基類中無法實現的。雖然抽象基類沒有完成,但是卻強制要求派生類完成,這就是抽象基類的「霸王條款」。
抽象基類除了約束派生類的功能,還可以實現多型。請注意第 51 行**,指標 p 的型別是 line,但是它卻可以訪問派生類中的 area() 和 volume() 函式,正是由於在 line 類中將這兩個函式定義為純虛函式;如果不這樣做,51 行後面的**都是錯誤的。我想,這或許才是c++提供純虛函式的主要目的。
關於純虛函式的幾點說明
1) 乙個純虛函式就可以使類成為抽象基類,但是抽象基類中除了包含純虛函式外,還可以包含其它的成員函式(虛函式或普通函式)和成員變數。
2) 只有類中的虛函式才能被宣告為純虛函式,普通成員函式和頂層函式均不能宣告為純虛函式。如下例所示:
C 虛析構函式例項
program 15.5.1.cpp include iostream define to version new 1 根據需要是否將 基類 虛構函式編譯為虛析構函式 virtual版 using namespace std class cshape class crectangle public ...
C 虛函式表例項分析
多型是c 物件導向程式設計的乙個重要特性。以前看到虛函式覺得很神奇,為什麼就能實現多型了呢。最初的時候曾設想,要實現執行時多型,應該讓物件的某個部分始終指向乙個固定的位址,子類繼承的時候,就修改這個位址的內容。這樣,父類和子類都是到同乙個固定位址去讀取內容,在執行時就能表現不同行為。在看了 深度探索...
C 中虛函式 虛表 虛指標例項講解
虛函式在c 中的實現機制就是用虛表和虛指標,但是具體是怎樣的呢?從more effecive c 其中一篇文章裡面可以知道 是每個類用了乙個虛表,每個類的物件用了乙個虛指標。具體的用法如下 class a class b public a a,b的實現省略 因為a有virtual void f 和g...