C 虛函式例項

2022-02-04 23:25:50 字數 1832 閱讀 7306

#include using

namespace

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...