實(shí)例代碼講解c++ 繼承特性
——派生類需要自己的構(gòu)造函數(shù)。
派生類中可以根據(jù)需要添加額外的數(shù)據(jù)成員和成員函數(shù),甚至可以給予繼承的原成員函數(shù)新的定義。
基類指針或引用可指向派生對象,反過來則只能使用強(qiáng)制類型轉(zhuǎn)換。
派生類對象可使用基類的非私有成員。
可使用派生對象初始化基類對象或賦值。
一般不允許將基類對象賦給派生類對象(上面第三條),特殊情況下可以。
已有派生類對象初始化創(chuàng)建的派生類對象。
已有派生類對象給另一個(gè)派生類對象賦值。
派生類對象的析構(gòu)函數(shù)被調(diào)用后會(huì)自動(dòng)調(diào)用基類的析構(gòu)函數(shù)。
C++11增加了允許繼承構(gòu)造函數(shù)的機(jī)制,但派生類默認(rèn)不能繼承構(gòu)造函數(shù)和析構(gòu)函數(shù)。
class RatedPlayer : public TableTennisPlayer
{
private:
unsigned int rating; // add a data member
public:
RatedPlayer (unsigned int r = 0, const string &fn = "none", const string &ln = "none", bool ht = false);
RatedPlayer (unsigned int r, const TableTennisPlayer &tp);
unsigned int Rating() const { return rating; } // add a method
void ResetRating (unsigned int r) { rating = r; } // add a method
};
構(gòu)造函數(shù)必須給新成員和繼承的成員提供數(shù)據(jù)。
RatedPlayer::RatedPlayer(unsigned int r, const string &fn, const string &ln, bool ht) : TableTennisPlayer(fn, ln, ht)
{
rating = r;
}
- 派生類構(gòu)造函數(shù)必須使用基類構(gòu)造函數(shù),創(chuàng)建派生類對象時(shí),程序首先創(chuàng)建基類對象(初始化繼承的數(shù)據(jù)成員)然后再調(diào)用派生類構(gòu)造函數(shù)。C++使用成員初始化列表語法完成該操作。
- 如沒有調(diào)用基類構(gòu)造函數(shù),那么將隱式調(diào)用基類的默認(rèn)構(gòu)造函數(shù)。除非要使用默認(rèn)構(gòu)造函數(shù),否則應(yīng)顯示調(diào)用正確的基類構(gòu)造函數(shù)。
派生類對象過期時(shí),程序?qū)⑹紫日{(diào)用派生類析構(gòu)函數(shù),然后再自動(dòng)調(diào)用基類析構(gòu)函數(shù)。
要使用派生類,程序必須要能訪問基類聲明。
派生類對象可以使用基類的方法,條件是方法不是私有的(即公有和保護(hù))。
基類指針可以在不進(jìn)行顯示類型轉(zhuǎn)換的情況下指向派生類對象;基類引用可以在不進(jìn)行顯示類型轉(zhuǎn)換的情況下引用派生類對象
RatedPlayer rplayer(1140, "Mallory", "Duck", true); TableTennisPlayer &rt = rplayer; TableTennisPlayer *pt =&rplayer; rt.Name(); // invoke Name() with reference pt->Name(); // invoke Name() with pointer
不可以將基類對象和地址賦給派生類引用和指針,除非使用強(qiáng)制轉(zhuǎn)換(友元函數(shù)不是成員函數(shù)因此不能被繼承,但欲使用基類的友元函數(shù)時(shí)可使用此方法,但要小心用錯(cuò))。
基類聲明的函數(shù)引用參數(shù)或指針參數(shù)可用于值為基類對象或派生類對象以及它們的地址的情況。
void Show(const TableTennisPlayer &rt)
{
...
}
TableTennisPlayer player1("Tara", "Boomdea", false);
RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
Show(player1); // works with TableTennisPlayer argument
Show(rplayer1); // works with RatedPlayer argument
省略形參為const TableTennisPlayer *rt的情況,與上相似。
引用兼容性屬性:可以將基類對象初始化為派生類對象。
RatedPlayer olaf1(1840, "Olaf", "Loaf", true); TableTennisPlayer olaf2(olaf1);
匹配的構(gòu)造函數(shù)的原型:
TableTennisPlayer(const RatedPlayer &); // doesn't exit
類中并沒有該構(gòu)造函數(shù),但存在隱式復(fù)制構(gòu)造函數(shù):
// implicit copy constructor TableTennisPlayer(const TableTennisPlayer &);
即它將olaf2初始化為嵌套在RatedPlayer對象olaf1中的TableTennisPlayer對象(使用派生類中嵌套的基類對象對目標(biāo)基類對象進(jìn)行初始化)
同樣,也可以將派生對象賦給基類對象:
RatedPlayer olaf1(1840, "Olaf", "Loaf", true); TableTennisPlayer winner; winner = olaf1; // assign derived to base object
在這種情況下,程序使用隱式重載賦值運(yùn)算符:
TableTennisPlayer &operator=(const TableTennisPlayer &) const;
與上類似,使用派生類中嵌套的基類對象對目標(biāo)基類對象進(jìn)行按成員賦值。
特殊的用基類對象給派生類對象賦值的情況
如果派生類包含了將基類對象轉(zhuǎn)換為派生類對象的構(gòu)造函數(shù),或派生類定義了將基類對象賦給派生類對象的賦值運(yùn)算符,則可以用派生類對象給基類對象賦值。
用已有的派生類對象初始化創(chuàng)建的派生類對象
復(fù)制類成員或繼承的類組件時(shí),則是使用該類的復(fù)制構(gòu)造函數(shù)完成的,對于繼承的基類對象來說也是合適的。
用已有的派生類對象給另一個(gè)派生類對象賦值
按成員賦值,調(diào)用類成員賦值運(yùn)算符,使用基類的賦值運(yùn)算符來對基類組件(繼承的基類對象)進(jìn)行賦值
若派生類使用了動(dòng)態(tài)內(nèi)存分配,派生類的析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)、復(fù)制運(yùn)算符都必須使用相應(yīng)的基類方法來處理基類元素(顯示調(diào)用基類構(gòu)造函數(shù)和復(fù)制運(yùn)算符):
- 對于析構(gòu)函數(shù),這是自動(dòng)完成的。
- 對于復(fù)制構(gòu)造函數(shù),這是在初始化成員列表中調(diào)用基類的復(fù)制構(gòu)造函數(shù)來完成的;如果不這么做,將自動(dòng)調(diào)用基類的默認(rèn)構(gòu)造函數(shù)。
- 對于復(fù)制運(yùn)算符,這是通過使用作用域解析運(yùn)算符顯示地調(diào)用基類的賦值運(yùn)算符來完成的:
hasDMA &hasDMA::operator=(const hasDMA &has)
{
if (this == &hs)
return *this;
baseDMA::operator=(hs); // copy base portion
...
return *this;
}
以上就是實(shí)例代碼講解c++ 繼承特性的詳細(xì)內(nèi)容,更多關(guān)于c++ 繼承特性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入理解C語言sizeof()計(jì)算空間大小為8的問題
本文將介紹C語言中的sizeof()函數(shù),以及如何使用它來計(jì)算變量、數(shù)據(jù)類型和數(shù)組在內(nèi)存中的大小,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
C語言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例
隊(duì)列只允許一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO的性質(zhì);隊(duì)列可用數(shù)組和鏈表 的方法實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組節(jié),出隊(duì)列時(shí)刪去首元素需要將整個(gè)數(shù)組前移,效率比較低2023-02-02
C語言二維數(shù)組應(yīng)用實(shí)現(xiàn)掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語言二維數(shù)組應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
MFC控件之CListCtrl的應(yīng)用實(shí)例教程
這篇文章主要介紹了MFC控件中CListCtrl的應(yīng)用方法,包括了針對表格的一些操作,是MFC中比較重要的一個(gè)控件類,需要的朋友可以參考下2014-08-08
C語言通過三步翻轉(zhuǎn)法實(shí)現(xiàn)單詞倒置詳解
這篇文章主要為大家分享了用三步翻轉(zhuǎn)法將一句話的單詞進(jìn)行倒置的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05
C 語言中實(shí)現(xiàn)環(huán)形緩沖區(qū)
本文主要是介紹 C語言實(shí)現(xiàn)環(huán)形緩沖區(qū),并附有詳細(xì)實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,希望能幫助有需要的小伙伴2016-07-07
使用C++實(shí)現(xiàn)MySQL數(shù)據(jù)庫連接池
這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)MySQL數(shù)據(jù)庫連接池,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下2024-03-03

