中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于c++繼承特性的講解分析

發布時間:2020-07-03 09:11:46 來源:億速云 閱讀:119 作者:清晨 欄目:開發技術

小編給大家分享一下關于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;
}
  • 派生類構造函數必須使用基類構造函數,創建派生類對象時,程序首先創建基類對象(初始化繼承的數據成員)然后再調用派生類構造函數。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; 
}

看完了這篇文章,相信你對關于c++繼承特性的講解分析有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠安县| 兴国县| 吴忠市| 湛江市| 陈巴尔虎旗| 从江县| 新竹县| 昌都县| 遂溪县| 呼和浩特市| 克拉玛依市| 仲巴县| 赤峰市| 剑阁县| 商丘市| 陇西县| 南靖县| 垦利县| 蓬溪县| 高邑县| 新乡县| 平凉市| 昌黎县| 安徽省| 怀柔区| 浪卡子县| 潼关县| 简阳市| 卢龙县| 高雄市| 毕节市| 商洛市| 仁寿县| 辽源市| 札达县| 九江市| 宁武县| 伊宁市| 安达市| 神农架林区| 竹山县|