38繼承和虛函式

2021-09-25 18:07:40 字數 2045 閱讀 8893

繼承後子類的成員函式會覆蓋基類的成員函式(過載函式也會被覆蓋)

被隱藏的基類函式是可以被呼叫的,如:

fido.mammal::move(2);

//dog 類的fido資料成員呼叫了其基類mammal的move函式

//注意使用域作用符

子型別關係: 子類是基類的子型別

虛函式(虛方法) → 多型 關鍵字virtual

多型的理解: 飛機、鳥、風箏等都會飛但是飛的方法不一樣;狗、貓、馬等都會叫但叫聲不同

虛函式表和動態繫結 必須呼叫指標或者引用的方式

// 38 繼承和虛函式

#include

using namespace std;

enum breed

;class mammal //基類

virtual ~

mammal()

virtual void

speak()

void

sleep()

void

move()

const

void

move

(int distance)

const

virtual mammal*

clone()

//利用虛複製建構函式

protected:

int itsage;

int itsweight;};

class dog : public mammal

virtual ~

dog(

)void

wagtail()

const

void

begforfood()

const

virtual void

speak()

//覆蓋了基類mammal的speak函式

void

move()

const

//覆蓋了move(),且所有相關的過載函式也被隱藏了

virtual mammal*

clone()

//利用虛複製建構函式

private:

breed itsbreed;};

class cat : public mammal

public:

virtual void

speak()

};class horse : public mammal

virtual mammal*

clone()

//利用虛複製建構函式};

class pig : public mammal

virtual mammal*

clone()

//利用虛複製建構函式};

class base};

class derived : public base};

void

fun(

const base& cb)

void

valuefunction

(mammal mammalvalue)

//普通變數按值傳遞(不能實現多型)

void

ptrfunction

(mammal *pmammal)

//傳指標

void

reffunction

(mammal &rmammal)

//傳引用

intmain()

for(

int i =

0; i <5;

++i)

for(

int i =

0; i <5;

++i)

for(

int i =

0; i <5;

++i)

for(

int i =

0; i <5;

++i)

for(

int i =

0; i <5;

++i)

return0;

}

虛繼承和虛函式繼承

虛繼承主要用於菱形 形式的繼承形式 虛繼承是為了在多繼承的時候避免引發歧義,比如類 有個就是a,繼承了 c也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...

繼承和虛函式

摘要 本文從5段 例項出發,通過類中類的普通繼承,類的虛繼承,類的多重繼承,多個虛函式類的普通繼承 虛繼承與多重繼承,幾個交叉概念,詳細的闡釋了繼承 虛函式與虛繼承的基本概念,深入剖析了繼承於虛繼承的區別於聯絡。exp.001 虛繼承 cpp view plain copy include clas...

關於虛函式和虛繼承

基類中無虛函式,派生類中有虛函式,基類的指標指向派生類物件 指向的是派生類中基類的起始部分 delete 時只析構基類的物件而不析構派生類的物件。基類指標指向派生類的的情況下,基類的虛構要設為虛析構。虛表合併時向內層合併,虛表合併時會先拷貝乙份副本,然後合併的時候使用副本合併。虛函式表的生成在編譯器...