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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

派生类类型可以转换为基类类型,反之则不行

發(fā)布時間:2023/11/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 派生类类型可以转换为基类类型,反之则不行 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

派生類的對象都含有基類對象作為其一部分,我們可以將指向派生類型的引用轉(zhuǎn)換為指向它的基類型的引用,像轉(zhuǎn)換指針一樣,我們可以用派生類的對象初始化或賦值基類對象,反之卻不行。class base{
public:
};

class derived:public base{
public:
};

int main(void) {
??? derived obj_d;
??? base obj_b=obj_d;//賦值運(yùn)算符
??? base obj_b2(obj_d);//用派生類對象初始化

??? derived &ref_d=obj_d;
??? base &ref_b=ref_d;
??? base &ref_b2(ref_d);

??? cout<<"end in main/n";
??? return EXIT_SUCCESS;
}
?
程序編譯沒有錯誤,只是會提示ref_b,ref_b2沒有使用,如果反過來轉(zhuǎn)換基類對象或引用為派生類型的則會報錯。
實(shí)際上,這里編譯器并沒有將派生類對象或引用“轉(zhuǎn)換”為基類型的,只是用派生類對象中的基類部分初始化或賦值基類對象,引用方面,將派生類基類部分的地址傳遞給基類型的引用。
前面在虛函數(shù)實(shí)例時,看到將派生類對象傳遞給參數(shù)為基類型引用的函數(shù),這時傳遞的是地址,實(shí)參的派生類對象還是派生類對象。
如果是參數(shù)為基類對象的函數(shù),情況有所不同,實(shí)參派生類對象的基類部分會被復(fù)制給一個函數(shù)體內(nèi)建立的臨時的基類對象。

當(dāng)我們用派生類對象初使化或賦值基類對象時,有兩種可能:
1.基類中定義了相應(yīng)的構(gòu)造函數(shù)和重載了賦值運(yùn)算符,這時將會按照相應(yīng)的函數(shù)進(jìn)行
class derived;
class base{
public:
??? base(const derived&);
??? base& operator=(derived &);
};
?

2.基類中并沒有定義相關(guān)的函數(shù),與情況1相比,這種情況更為常見。
? 通常基類中會有考構(gòu),其參數(shù)為const 基類型引用考構(gòu)會幫我們完成派生類對象初始化或賦值基類型對象,其中發(fā)生指向派生類的引用轉(zhuǎn)換為基類型的引用。開頭的示例程序:

??? base obj_b=obj_d;//賦值運(yùn)算符
??? base obj_b2(obj_d);//用派生類對象初始化,調(diào)用的構(gòu)造函數(shù)
派生類中的基類部分好像被“切割”(slice down)下一樣,賦值給基類對象。

派生類-基類 轉(zhuǎn)換后的成員訪問問題
? 如果是公有派生,轉(zhuǎn)換后,可以訪問基類對象的相應(yīng)成員,如果是保護(hù)或私有派生則不可。
class base{
public:
??? int pub;
protected:
??? int pro;
};

class derived:public base{
public:
};

int main(void) {
??? derived obj_d;
??? base obj_b=obj_d;//賦值運(yùn)算符

??? cout<<obj_b.pub<<" "<<endl;
??? cout<<"end in main/n";
??? return EXIT_SUCCESS;
}

?
程序沒有任何問題,輸出結(jié)果為一隨機(jī)值,因為我們沒有定義任何構(gòu)造函數(shù)為數(shù)據(jù)成員初始化。
如果將派生類型變?yōu)楸Wo(hù)或私有
class derived:protected base{
public:
};
?
編譯報錯? `base' is an inaccessible base of `derived'
而且,私有派生時,其后續(xù)派生的類是不可轉(zhuǎn)換為基類型的,保護(hù)派生可以。

基類-派生類 的轉(zhuǎn)換
無論是用基類對象還是引用初始化派生類對象或引用都是不可以的,基類對象其所占的內(nèi)存空間中并沒有派生類所定義的只屬于它自己的那一部分。即使是有一個基類型的引用,其此時正好指向一個派生類對象,我們也不可將其轉(zhuǎn)換為派生類型的引用,因為編譯時編譯器檢查的是靜態(tài)類型。

轉(zhuǎn)載于:https://blog.51cto.com/lihaichuan/1060930

總結(jié)

以上是生活随笔為你收集整理的派生类类型可以转换为基类类型,反之则不行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。