虛基類的作用 使用及抽象基類虛析構函式問題

2021-10-03 13:46:05 字數 1645 閱讀 8425

1、虛基類:

虛基類解決的問題:

當存在基類a,類b與c派生自a,類d派生自類b與c時,類d中存在兩個類a物件導致二義性問題。

二義性問題還有如:物件d不知道呼叫哪個類b或類c中均存在的func()方法。

如何使用虛基類:

//.h

class a

;class b

:public

virtual a

;//此時類a稱為類b的虛基類

class c

:virtual

public a

;//此時類a稱為類c的虛基類

class d

:public b,

public c

;

此時類d的例項化物件中只存在乙個類a物件,因此不存在二義性問題。這是c++定義的新語法,以不增加新關鍵字為原則因此使用了virtual作為修飾符。

//.cpp

d::d

(const a& a,variable x,variable y,..

.):a

(a),

b(a,x),c

(a,y)

d::d

(const b& b,variable x,variable y,..

.):a

(b),

b(b,x),c

(b,y)

將類b物件b給與類a與類c建構函式,因為其基類均是a,

基類引用可以指向派生類,因此不存在問題。

普通的多重繼承,派生類只能呼叫上一級基類(即時基類)的建構函式,但在虛繼承問題中,類d必須直接呼叫類a的建構函式(語法規定),對於非虛基類,則直接呼叫非法。

a) 虛繼承會增加大小、速度、初始化複雜度等成本,應該經歷避免虛繼承與多重繼承。

2、抽象基類:

包含純虛函式的類稱為抽象類,抽象類不能夠例項化,至少包含乙個純虛函式的類稱為抽象類。

純虛函式:將虛函式宣告結尾處為=0,不進行函式定義,如:

//.h

class a

virtual

show()

;//在cpp檔案中實現

virtual

express()

=0;//純虛函式 不需要實現

virtual~a

();//cpp中實現

};

純虛析構函式:當需要定義乙個抽象類,而類中又沒有其他純虛函式,因為至少包含乙個純虛函式才能成為抽象類,因此可以將虛析構函式設定為純虛的。

//.h

class a..

.virtual~a

()=0

;};//.cpp

a::~a(

)

1、虛基類是針對派生時的基類而言的,單獨看類a不存在虛基類的說法。

2、virtual 和 public 兩個修飾符的位置可以互換。

3、基類a可以為抽象類也可以為普通類

4、在派生類中直接呼叫虛基類建構函式。

5、雖然抽象類的析構函式可以是純虛函式,但必須提供析構函式的定義。

虛基類的作用

1 當在多條繼承路徑上有乙個公共的基類,在這些路徑的某幾條匯合處,這個公共的基類就會產生多個例項 或多個副本 若只想儲存這個基類的乙個例項,可以將這個公共基類說明為虛基類 class cbase class childa1 virtual public cbase class childa2 vir...

虛函式 虛基類 抽象類

一 虛基類 解決二義性,防止雙份拷貝間接基類。否則得用作用域分辨符來區分進行的多個拷貝 將共同基類設定為虛函式,這是從不同的路徑繼承過來的同名資料成員在記憶體中就只有乙個拷貝,同乙個函式名也只有乙個對映。虛基類的宣告是在派生類的定義過程中進行的,語法形式為 class 派生類名 virtual繼承方...

虛基類 虛函式和純虛基類

首先看乙個例子 class base class child1 public base class child2 public base void main else p print 函式呼叫的時候,檢視虛表,根據p的位址首先從虛表裡面查詢要呼叫的函式 這裡呼叫child2的print 函式 ret...