您好,登錄后才能下訂單哦!
小編給大家分享一下關于c++繼承特性的講解分析,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!
——派生類需要自己的構造函數。
派生類中可以根據需要添加額外的數據成員和成員函數,甚至可以給予繼承的原成員函數新的定義。
基類指針或引用可指向派生對象,反過來則只能使用強制類型轉換。
派生類對象可使用基類的非私有成員。
可使用派生對象初始化基類對象或賦值。
一般不允許將基類對象賦給派生類對象(上面第三條),特殊情況下可以。
已有派生類對象初始化創建的派生類對象。
已有派生類對象給另一個派生類對象賦值。
派生類對象的析構函數被調用后會自動調用基類的析構函數。
C++11增加了允許繼承構造函數的機制,但派生類默認不能繼承構造函數和析構函數。
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 };
構造函數必須給新成員和繼承的成員提供數據。
RatedPlayer::RatedPlayer(unsigned int r, const string &fn, const string &ln, bool ht) : TableTennisPlayer(fn, ln, ht) { rating = r; }
派生類對象過期時,程序將首先調用派生類析構函數,然后再自動調用基類析構函數。
要使用派生類,程序必須要能訪問基類聲明。
派生類對象可以使用基類的方法,條件是方法不是私有的(即公有和保護)。
基類指針可以在不進行顯示類型轉換的情況下指向派生類對象;基類引用可以在不進行顯示類型轉換的情況下引用派生類對象
RatedPlayer rplayer(1140, "Mallory", "Duck", true); TableTennisPlayer &rt = rplayer; TableTennisPlayer *pt =&rplayer; rt.Name(); // invoke Name() with reference pt->Name(); // invoke Name() with pointer
不可以將基類對象和地址賦給派生類引用和指針,除非使用強制轉換(友元函數不是成員函數因此不能被繼承,但欲使用基類的友元函數時可使用此方法,但要小心用錯)。
基類聲明的函數引用參數或指針參數可用于值為基類對象或派生類對象以及它們的地址的情況。
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);
匹配的構造函數的原型:
TableTennisPlayer(const RatedPlayer &); // doesn't exit
類中并沒有該構造函數,但存在隱式復制構造函數:
// implicit copy constructor TableTennisPlayer(const TableTennisPlayer &);
即它將olaf2初始化為嵌套在RatedPlayer對象olaf1中的TableTennisPlayer對象(使用派生類中嵌套的基類對象對目標基類對象進行初始化)
同樣,也可以將派生對象賦給基類對象:
RatedPlayer olaf1(1840, "Olaf", "Loaf", true); TableTennisPlayer winner; winner = olaf1; // assign derived to base object
在這種情況下,程序使用隱式重載賦值運算符:
TableTennisPlayer &operator=(const TableTennisPlayer &) const;
與上類似,使用派生類中嵌套的基類對象對目標基類對象進行按成員賦值。
特殊的用基類對象給派生類對象賦值的情況
如果派生類包含了將基類對象轉換為派生類對象的構造函數,或派生類定義了將基類對象賦給派生類對象的賦值運算符,則可以用派生類對象給基類對象賦值。
用已有的派生類對象初始化創建的派生類對象
復制類成員或繼承的類組件時,則是使用該類的復制構造函數完成的,對于繼承的基類對象來說也是合適的。
用已有的派生類對象給另一個派生類對象賦值
按成員賦值,調用類成員賦值運算符,使用基類的賦值運算符來對基類組件(繼承的基類對象)進行賦值
若派生類使用了動態內存分配,派生類的析構函數、復制構造函數、復制運算符都必須使用相應的基類方法來處理基類元素(顯示調用基類構造函數和復制運算符):
hasDMA &hasDMA::operator=(const hasDMA &has) { if (this == &hs) return *this; baseDMA::operator=(hs); // copy base portion ... return *this; }
看完了這篇文章,相信你對關于c++繼承特性的講解分析有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。