C 基類與派生類的轉換與多型性

2021-06-29 16:25:37 字數 1888 閱讀 5249

1》首先建立乙個基類student類

標頭檔案student.h 如下:

#ifndef student_h

#define student_h

#includeusing namespace std;

/*基類student標頭檔案

*/class student;

#endif

2》基類student實現

student.cpp

#include"student.h"

#includestudent::student(int num, std::string name, float score)

void student::display();

#endif

4》派生類graduate實現

#include#include"graduate.h"

graduate::graduate(int num, std::string name, float score,float wage):student(num,name,score)

void graduate::display()

執行結果如下:

第二次只是輸出了派生類中相應的基類成員,而派生類中新增的資料成員「wage」沒有輸出 。

6》如何才能使其輸出呢(即實現多型性)

將基類student類中的display函式宣告為虛函式即可:virtual void display();

再次執行就可以發現,可以利用父類的指標(p_stu)指向子類的物件(gra),通過p_stu->display()即可呼叫子類的display函式了。

7》這種多型性也適用於析構函式中。

上述兩個類均未給出析構函式的形式,其使用預設析構函式

當類中存在有動態分配的儲存時,該類的物件析構時也要進行**資源。這裡為了實驗,只是列印一句話。

分別在標頭檔案和類實現中宣告和實現該析構函式,如下:

宣告:

~student();
實現:

student::~student(){

cout<

宣告:~graduate();

實現:

graduate::~graduate(){

cout<

在main函式中有如下語句 :

student *p_stu=new graduate(3001,"zhang",88.7,300);

p_stu->display();

delete p_stu;

此時結果為:

可以看出,只執行了基類的析構函式,而沒有執行派生類的析構函式。原因跟之前 介紹 的display()函式呼叫相同。

8》如何也能執行派生類的析構函式呢?

方法與之前介紹的display函式一樣,使用虛函式,即使用虛析構函式。

將析構函式宣告為虛函式:即在前面新增virtual即可(只需要在基類中宣告為virtual即可,其派生類自動變為virtual)。

此時結果為:

基類與派生類的轉換

一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...

基類與派生類的轉換

一 基類與派生類的轉換 3種繼承方式 公用 保護 私有繼承 中,公用派生類才是基類真正的子型別,它完整地繼承了基類的功能。不同型別資料之間在一定條件下可以進行型別的轉換。基類與派生類物件之間是否也有賦值相容的關係,可否進行型別間的轉換?回答是可以的。基類與派生類物件之間有賦值相容關係,由於派生類中包...

基類與派生類

初學c 的時候,很多人都很頭疼各種訪問標號下基類與派生類的關係,其實,死記硬背肯定不是乙個好的辦法,要知道它們之間的關係,先要分析一下訪問標號是如何產生的 在沒有繼承之前,類的只有兩類使用者 類本身和類的使用者。把類成員通過public和private劃分恰好體現了這一分割 類的使用者只能訪問類的p...