激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - C++派生類與基類的轉(zhuǎn)換規(guī)則

C++派生類與基類的轉(zhuǎn)換規(guī)則

2020-11-13 11:51C++教程網(wǎng) C/C++

基類與派生類對象之間有賦值兼容關(guān)系,由于派生類中包含從基類繼承的成員,具體表現(xiàn)在以下幾個方面,需要的朋友可以參考下

只有公用派生類才是基類真正的子類型,它完整地繼承了基類的功能。基類與派生類對象之間有賦值兼容關(guān)系,由于派生類中包含從基類繼承的成員,因此可以將派生類的值賦給基類對象,在用到基類對象的時候可以用其子類對象代替。
具體表現(xiàn)在以下幾個方面
派生類對象可以向基類對象賦值。
可以用子類(即公用派生類)對象對其基類對象賦值。如
A a1; //定義基類A對象a1
B b1; //定義類A的公用派生類B的對象b1
a1=b1; //用派生類B對象b1對基類對象a1賦值
在賦值時舍棄派生類自己的成員。
實(shí)際上,所謂賦值只是對數(shù)據(jù)成員賦值,對成員函數(shù)不存在賦值問題。請注意: 賦值后不能企圖通過對象a1去訪問派生類對象b1的成員,因?yàn)閎1的成員與a1的成員是不同的。
假設(shè)age是派生類B中增加的公用數(shù)據(jù)成員,分析下面的用法:
a1.age=23;//錯誤,a1中不包含派生類中增加的成員
b1.age=21; //正確,b1中包含派生類中增加的成員
應(yīng)當(dāng)注意,子類型關(guān)系是單向的、不可逆的。B是A的子類型,不能說A是B的子類型。
只能用子類對象對其基類對象賦值,而不能用基類對象對其子類對象賦值,理由是顯然的,因?yàn)榛悓ο蟛话缮惖某蓡T,無法對派生類的成員賦值。同理,同一基類的不同派生類對象之間也不能賦值。
派生類對象可以替代基類對象向基類對象的引用進(jìn)行賦值或初始化。
如已定義了基類A對象a1,可以定義a1的引用變量:
A a1; //定義基類A對象a1
B b1; //定義公用派生類B對象b1
A& r=a1; //定義基類A對象的引用變量r,并用a1對其初始化
這時,引用變量r是a1的別名,r和a1共享同一段存儲單元。也可以用子類對象初始化引用變量r,將上面最后一行改為
A& r=b1;//定義基類A對象的引用變量r,并用派生類B對象b1//對其初始化
或者保留上面第3行“A& r=a1;”,而對r重新賦值:
r=b1;//用派生類B對象b1對a1的引用變量r賦值
注意: 此時r并不是b1的別名,也不與b1共享同一段存儲單元。它只是b1中基類部分的別名,r與b1中基類部分共享同一段存儲單元,r與b1具有相同的起始地址。
如果函數(shù)的參數(shù)是基類對象或基類對象的引用,相應(yīng)的實(shí)參可以用子類對象。如有一函數(shù)

復(fù)制代碼 代碼如下:


fun: void fun(A& r)//形參是類A的對象的引用變量
{
cout<<r.num<<endl;
} //輸出該引用變量的數(shù)據(jù)成員num
函數(shù)的形參是類A的對象的引用變量,本來實(shí)參應(yīng)該為A類的對象。由于子類對象與派生類對象賦值兼容,派生類對象能自動轉(zhuǎn)換類型,在調(diào)用fun函數(shù)時可以用派生類B的對象b1作實(shí)參: fun(b1); 輸出類B的對象b1的基類數(shù)據(jù)成員num的值。與前相同,在fun函數(shù)中只能輸出派生類中基類成員的值。
派生類對象的地址可以賦給指向基類對象的指針變量,也就是說,指向基類對象的指針變量也可以指向派生類對象。
例11.10 定義一個基類Student(學(xué)生),再定義Student類的公用派生類Graduate(研究生), 用指向基類對象的指針輸出數(shù)據(jù)。本例主要是說明用指向基類對象的指針指向派生類對象,為了減少程序長度,在每個類中只設(shè)很少成員。學(xué)生類只設(shè)num(學(xué)號),name(名字)和score(成績)3個數(shù)據(jù)成員,Graduate類只增加一個數(shù)據(jù)成員pay(工資)。
程序如下:
[code]
#include <iostream>
#include <string>
Graduate::Graduate(int n, string nam,float s,float p):Student(n,nam,s),pay(p){ }
using namespace std;
class Student//聲明Student類
{
public :
Student(int, string,float );//聲明構(gòu)造函數(shù)
void display( );//聲明輸出函數(shù)
private :
int num;
string name;
float score;
};
Student::Student(int n, string nam,float s) //定義構(gòu)造函數(shù)
{
num=n;
name=nam;
score=s;
}
void Student::display( )//定義輸出函數(shù)
{
cout<<endl<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″score:″<<score<<endl;
}
class Graduate:public Student//聲明公用派生類Graduate
{
public :
Graduate(int, string ,float ,float );//聲明構(gòu)造函數(shù)
void display( );//聲明輸出函數(shù)
private :
float pay;//工資
};
//定義構(gòu)造函數(shù)
void Graduate::display() //定義輸出函數(shù)
{
Student::display(); //調(diào)用Student類的display函數(shù)
cout<<″pay=″<<pay<<endl;
}
int main()
{
Student stud1(1001,″Li″,87.5); //定義Student類對象stud1
Graduate grad1(2001,″Wang″,98.5,563.5); //定義Graduate類對象grad1
Student *pt=&stud1;//定義指向Student類對象的指針并指向stud1
pt->display( ); //調(diào)用stud1.display函數(shù)
pt=&grad1; //指針指向grad1
pt->display( ); //調(diào)用grad1.display函數(shù)
}


很多讀者會認(rèn)為: 在派生類中有兩個同名的display成員函數(shù),根據(jù)同名覆蓋的規(guī)則,被調(diào)用的應(yīng)當(dāng)是派生類Graduate對象的display函數(shù),在執(zhí)行Graduate::display函數(shù)過程中調(diào)用Student::display函數(shù),輸出num,name,score,然后再輸出pay的值。
事實(shí)上這種推論是錯誤的,先看看程序的輸出結(jié)果:
num:1001
name:Li
score:87.5
num:2001
name:wang
score:98.5
并沒有輸出pay的值。
問題在于pt是指向Student類對象的指針變量,即使讓它指向了grad1,但實(shí)際上pt指向的是grad1中從基類繼承的部分。
通過指向基類對象的指針,只能訪問派生類中的基類成員,而不能訪問派生類增加的成員。所以pt->display()調(diào)用的不是派生類Graduate對象所增加的display函數(shù),而是基類的display函數(shù),所以只輸出研究生grad1的num,name,score3個數(shù)據(jù)。
如果想通過指針輸出研究生grad1的pay,可以另設(shè)一個指向派生類對象的指針變量ptr,使它指向grad1,然后用ptr->display()調(diào)用派生類對象的display函數(shù)。但這不大方便。
通過本例可以看到: 用指向基類對象的指針變量指向子類對象是合法的、安全的,不會出現(xiàn)編譯上的錯誤。但在應(yīng)用上卻不能完全滿足人們的希望,人們有時希望通過使用基類指針能夠調(diào)用基類和子類對象的成員。
我們會在下一講解決這個問題,辦法是使用虛函數(shù)和多態(tài)性

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 成年人免费视频播放 | 久久精精| 爱爱视频天天干 | 日韩精品中文字幕一区二区三区 | 国产精品视频海角社区88 | 在线观看免费污视频 | 日韩大片在线永久观看视频网站免费 | 久久99精品久久久久久久久久久久 | 欧美精品一级片 | 中文字幕亚洲一区二区三区 | 黄片毛片一级 | 久久网站热最新地址4 | 成人免费在线播放 | 欧美一级黄色免费看 | 精品91av| 日本网站在线看 | 欧美一级无毛 | 91情侣在线偷精品国产 | 中文字幕精品久久 | 国产在线欧美日韩 | 国产羞羞视频在线免费观看 | 九九热播视频 | 日日草夜夜 | 国产精品一区二av18款 | 色屁屁xxxxⅹ免费视频 | 久久伊人国产精品 | 亚洲操比视频 | 免费国产在线精品 | 亚洲最大久久 | 久久久久久久久久亚洲 | 18pao国产成人免费视频 | 羞羞视频免费入口网站 | 日韩视频一区二区三区在线观看 | 国产精品久久久久久久久久免 | 久草在线视频新 | 91看片成人 | av影片在线观看 | 久久精品亚洲一区二区 | 久久精品国产清自在天天线 | 精品国产一区在线 | 国产一区二区三区高清 |