——派生類需要自己的建構式,
派生類中可以根據需要添加額外的資料成員和成員函式,甚至可以給予繼承的原成員函式新的定義,
基類指標或參考可指向派生物件,反過來則只能使用強制型別轉換,
派生類物件可使用基類的非私有成員,
可使用派生物件初始化基類物件或賦值,
一般不允許將基類物件賦給派生類物件(上面第三條),特殊情況下可以,
已有派生類物件初始化創建的派生類物件,
已有派生類物件給另一個派生類物件賦值,
派生類物件的解構式被呼叫后會自動呼叫基類的解構式,
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; }
- 派生類建構式必須使用基類建構式,創建派生類物件時,程式首先創建基類物件(初始化繼承的資料成員)然后再呼叫派生類建構式,C++使用成員初始化串列語法完成該操作,
- 如沒有呼叫基類建構式,那么將隱式呼叫基類的默認建構式,除非要使用默認建構式,否則應顯示呼叫正確的基類建構式,
派生類物件過期時,程式將首先呼叫派生類解構式,然后再自動呼叫基類解構式,
要使用派生類,程式必須要能訪問基類宣告,
派生類物件可以使用基類的方法,條件是方法不是私有的(即公有和保護),
基類指標可以在不進行顯示型別轉換的情況下指向派生類物件;基類參考可以在不進行顯示型別轉換的情況下參考派生類物件
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; }
---
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/4982.html
標籤:C++
上一篇:C++ 公有派生
下一篇:C++ 多型公有繼承
