C 繼承4 Is a 基類的指標指向派生類的物件

2021-09-22 01:50:42 字數 2575 閱讀 3902

/*公有繼承: is a

1.person類,資料成員:m_strname 成員函式:構造、析構、piay()

2.soldier類,資料成員:m_iage 成員函式:構造、析構、work()

*/person.h

#include#includeusing namespace std;

class person

;

person.cpp

#include"person.h"

person::person(string name)

;

soldier.cpp

#include"soldier.h"

soldier::soldier(string name,int age)

執行結果:

用父類的指標只能呼叫自己的資料成員和成員函式

main.cpp

#include"soldier.h"

int main(void)

執行結果:

用soldier這個物件來初始化person的p,執行結果先構造person()再構造soldier(),用p來呼叫自己的成員函式play(),p中m_strname的值為soldier中的wls;說明用soldier這個物件來初始化person的p這個方式,可以使soldier當中的m_strname賦值給父類物件當中的對應的資料成員。

main.cpp

#include"soldier.h"

int main(void)

執行結果:

執行結果:

我們發現在delete的時候,執行了父類的析構函式而沒有執行子類的,這樣會造成記憶體洩漏,那麼該如何避免呢?—>使用virtual關鍵字

在person.h和soldier.h中的析構函式前加上virtual關鍵字,再次執行

virtual關鍵字是可以被繼承下去的

執行結果:

/*公有繼承: is a

1.person類,資料成員:m_strname 成員函式:構造、析構、piay()

2.soldier類,資料成員:m_iage 成員函式:構造、析構、work()

3.定義函式test1(person p) test2(person &p) test3(person *p)

*/main.cpp

#include"soldier.h"

void test1(person p)//引數是物件p,傳值的時候先例項化乙個臨時物件p,所以執行完後要銷毀

int main(void)

執行結果:

如果函式的引數是基類的物件,那麼基類的物件和派生類的物件都可以作為實參傳遞進來並且能都正常使用,只不過引數是物件,傳值的時候要先例項化乙個臨時物件p,所以執行完後要銷毀。

main.cpp

#include"soldier.h"

void test2(person &p)//使用基類的引用也可以接收基類的物件和派生類的物件

int main(void)

執行結果:

引用 在傳入引數的時候,會將這個引數起乙個別名p,通過這個別名p來呼叫play;在這個過程當中並沒有例項化乙個臨時物件,所以也沒有銷毀臨時物件的痕跡。

使用基類的引用也可以接收基類的物件和派生類的物件

main.cpp

#include"soldier.h"

void test3(person *p)//引數是乙個基類的指標

int main(void)

執行結果:

使用基類的指標也可以接收基類的物件和派生類的物件

c 基類指標指向繼承類呼叫繼承類函式

類裡面過載運算子 需要使用友元函式,而友元函式,不能作為虛函式。所以,基類指標無法直接呼叫繼承類裡重構的 使用類轉換,能解決掉,基類指標 呼叫 繼承類 函式的問題。include include include using namespace std class person friend istr...

繼承,基類指標指向子類物件

include include using namespace std class a a a class b public a b void update void print b b class c public a c void update void print c c class d pu...

c (基類指標 多重繼承與多繼承)

一般的,如果定義乙個指向基類型別的指標,那麼這種型別的指標具有如下特性 比如基類baseclass擁有函式f,其子類childclass中覆蓋了函式f,那麼如下語句將仍然呼叫a的函式f baseclass aptr 基類型別的指標 childclass child aptr child 仍可以指向子...