實(shí)例代碼講解c++ 繼承特性
——派生類需要自己的構(gòu)造函數(shù)。
派生類中可以根據(jù)需要添加額外的數(shù)據(jù)成員和成員函數(shù),甚至可以給予繼承的原成員函數(shù)新的定義。
基類指針或引用可指向派生對(duì)象,反過來則只能使用強(qiáng)制類型轉(zhuǎn)換。
派生類對(duì)象可使用基類的非私有成員。
可使用派生對(duì)象初始化基類對(duì)象或賦值。
一般不允許將基類對(duì)象賦給派生類對(duì)象(上面第三條),特殊情況下可以。
已有派生類對(duì)象初始化創(chuàng)建的派生類對(duì)象。
已有派生類對(duì)象給另一個(gè)派生類對(duì)象賦值。
派生類對(duì)象的析構(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)建派生類對(duì)象時(shí),程序首先創(chuàng)建基類對(duì)象(初始化繼承的數(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ù)。
派生類對(duì)象過期時(shí),程序?qū)⑹紫日{(diào)用派生類析構(gòu)函數(shù),然后再自動(dòng)調(diào)用基類析構(gòu)函數(shù)。
要使用派生類,程序必須要能訪問基類聲明。
派生類對(duì)象可以使用基類的方法,條件是方法不是私有的(即公有和保護(hù))。
基類指針可以在不進(jìn)行顯示類型轉(zhuǎn)換的情況下指向派生類對(duì)象;基類引用可以在不進(jìn)行顯示類型轉(zhuǎn)換的情況下引用派生類對(duì)象
RatedPlayer rplayer(1140, "Mallory", "Duck", true); TableTennisPlayer &rt = rplayer; TableTennisPlayer *pt =&rplayer; rt.Name(); // invoke Name() with reference pt->Name(); // invoke Name() with pointer
不可以將基類對(duì)象和地址賦給派生類引用和指針,除非使用強(qiáng)制轉(zhuǎn)換(友元函數(shù)不是成員函數(shù)因此不能被繼承,但欲使用基類的友元函數(shù)時(shí)可使用此方法,但要小心用錯(cuò))。
基類聲明的函數(shù)引用參數(shù)或指針參數(shù)可用于值為基類對(duì)象或派生類對(duì)象以及它們的地址的情況。
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的情況,與上相似。
引用兼容性屬性:可以將基類對(duì)象初始化為派生類對(duì)象。
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對(duì)象olaf1中的TableTennisPlayer對(duì)象(使用派生類中嵌套的基類對(duì)象對(duì)目標(biāo)基類對(duì)象進(jìn)行初始化)
同樣,也可以將派生對(duì)象賦給基類對(duì)象:
RatedPlayer olaf1(1840, "Olaf", "Loaf", true); TableTennisPlayer winner; winner = olaf1; // assign derived to base object
在這種情況下,程序使用隱式重載賦值運(yùn)算符:
TableTennisPlayer &operator=(const TableTennisPlayer &) const;
與上類似,使用派生類中嵌套的基類對(duì)象對(duì)目標(biāo)基類對(duì)象進(jìn)行按成員賦值。
特殊的用基類對(duì)象給派生類對(duì)象賦值的情況
如果派生類包含了將基類對(duì)象轉(zhuǎn)換為派生類對(duì)象的構(gòu)造函數(shù),或派生類定義了將基類對(duì)象賦給派生類對(duì)象的賦值運(yùn)算符,則可以用派生類對(duì)象給基類對(duì)象賦值。
用已有的派生類對(duì)象初始化創(chuàng)建的派生類對(duì)象
復(fù)制類成員或繼承的類組件時(shí),則是使用該類的復(fù)制構(gòu)造函數(shù)完成的,對(duì)于繼承的基類對(duì)象來說也是合適的。
用已有的派生類對(duì)象給另一個(gè)派生類對(duì)象賦值
按成員賦值,調(diào)用類成員賦值運(yùn)算符,使用基類的賦值運(yùn)算符來對(duì)基類組件(繼承的基類對(duì)象)進(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)算符):
- 對(duì)于析構(gòu)函數(shù),這是自動(dòng)完成的。
- 對(duì)于復(fù)制構(gòu)造函數(shù),這是在初始化成員列表中調(diào)用基類的復(fù)制構(gòu)造函數(shù)來完成的;如果不這么做,將自動(dòng)調(diào)用基類的默認(rèn)構(gòu)造函數(shù)。
- 對(duì)于復(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++ 繼承特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Qt實(shí)現(xiàn)繪制一個(gè)簡(jiǎn)單多邊形的示例代碼
QT提供了圖形繪制接口QPainter,通過該接口可以繪制多種圖形,包括多邊形。本文就來利用它實(shí)現(xiàn)繪制一個(gè)簡(jiǎn)單的多邊形,感興趣的可以嘗試一下2022-11-11C語言數(shù)據(jù)結(jié)構(gòu)順序表的進(jìn)階講解
程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示2022-04-04關(guān)于c++ 智能指針及 循環(huán)引用的問題
下面小編就為大家?guī)硪黄P(guān)于c++ 智能指針及 循環(huán)引用的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01數(shù)據(jù)結(jié)構(gòu)串的操作實(shí)例詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)串的操作實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07C/C++關(guān)于實(shí)現(xiàn)CAN信號(hào)的獲取方法
這篇文章主要介紹了C/C++關(guān)于實(shí)現(xiàn)CAN信號(hào)的獲取方法,標(biāo)準(zhǔn)的CAN 數(shù)據(jù)為8字節(jié),即64位,但是CAN FD的最大數(shù)據(jù)可為64字節(jié),為512位,其中的幀ID分為標(biāo)準(zhǔn)幀和擴(kuò)展幀,其中用11位標(biāo)準(zhǔn)幀,用29位表示擴(kuò)展幀2023-02-02C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表操作詳解
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的常用操作,感興趣的可以學(xué)習(xí)一下2022-07-07C語言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問題
Dynamic Programming動(dòng)態(tài)規(guī)劃方法采用最優(yōu)原則來建立用于計(jì)算最優(yōu)解的遞歸式,并且考察每個(gè)最優(yōu)決策序列中是否包含一個(gè)最優(yōu)子序列,這里我們就來展示C語言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問題2016-06-06