日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++基类与派生类的转换与多态性

發布時間:2024/4/15 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++基类与派生类的转换与多态性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1》首先建立一個基類Student類

頭文件Student.h 如下:

#ifndef Student_h #define Student_h #include<string> using namespace std; /* 基類Student頭文件 */ class Student{ protected:int num;string name;float score;public:Student(int num,string name,float score);void display();//******這里沒有聲明為virtual};#endif

2》基類Student實現

Student.cpp

#include"Student.h" #include<iostream> Student::Student(int num, std::string name, float score){this->num=num;this->name=name;this->score=score;} void Student::display(){cout<<"num:"<<this->num<<endl;cout<<"name:"<<this->name<<endl;cout<<"score:"<<this->score<<endl;}

3》派生類Graduate類頭文件

#ifndef Graduate_h #define Graduate_h #include"Student.h" /* 派生類頭文件,公有繼承Student類,并增加新屬性wage; */ class Graduate:public Student{protected:float wage;public:Graduate(int num,string name,float score,float wage);void display(); };#endif

4》派生類Graduate實現

#include<iostream> #include"Graduate.h" Graduate::Graduate(int num, std::string name, float score,float wage):Student(num,name,score){this->wage=wage; }void Graduate::display(){cout<<"num:"<<this->num<<endl;cout<<"name:"<<this->name<<endl;cout<<"score:"<<this->score<<endl;cout<<"wage:"<<this->wage<<endl;}


5》測試

#include<iostream> #include"Student.h" #include"Graduate.h" using namespace std; int main(){Student stu(1001,"LI",78.9);Graduate gra(2001,"Wang",88.9,200.0);Student *p_stu=&stu;//聲明基類Student類的指針并指向Student類的對象p_stu->display();//通過指針調用display函數。---正常輸出stu的num,name,scorep_stu=&gra;//基類Student類的指針指向派生類Graduate類的對象(兼容賦值)p_stu->display();//通過指針調用display函數。---只能輸出派生類中基類成員的值return 0;}


運行結果如下:

第二次只是輸出了派生類中相應的基類成員,而派生類中新增的數據成員“wage”沒有輸出 。

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

將基類Student類中的display函數聲明為虛函數即可:virtual void display();

再次運行就可以發現,可以利用父類的指針(p_stu)指向子類的對象(gra),通過p_stu->display()即可調用子類的display函數了。

7》這種多態性也適用于析構函數中。

上述兩個類均未給出析構函數的形式,其使用默認析構函數

當類中存在有動態分配的存儲時,該類的對象析構時也要進行回收資源。這里為了實驗,只是打印一句話。

分別在頭文件和類實現中聲明和實現該析構函數,如下:

聲明:

~Student();實現:

Student::~Student(){cout<<"executing Student destructor"<<endl; }


?

聲明:

~Graduate();

實現:

Graduate::~Graduate(){cout<<"executing Student destructor"<<endl;}


在Main函數中有如下語句 :

Student *p_stu=new Graduate(3001,"zhang",88.7,300);p_stu->display();delete p_stu;

此時結果為:

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

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

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

將析構函數聲明為虛函數:即在前面添加Virtual即可(只需要在基類中聲明為Virtual即可,其派生類自動變為virtual)。

此時結果為:







與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的C++基类与派生类的转换与多态性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。