首頁 >後端開發 >C#.Net教程 >【C++】深入了解繼承方式基礎知識及其與存取限定符的關係

【C++】深入了解繼承方式基礎知識及其與存取限定符的關係

php是最好的语言
php是最好的语言原創
2018-07-30 11:32:012780瀏覽

繼承方式與存取限定符的關係

三種繼承方式:

  1. #公有繼承

  2. 私有繼承

  3. 保護繼承

關係:若基底類別的成員函數為私有,則衍生類別對基底類別的私有成員是不可見的,其他的標準為選範圍小的為最終訪問限定。

保護成員限定符:有些基底類別成員不想被基底類別的物件直接訪問,但需要在衍生類別中才能訪問,就定義為保護成員。保護成員限定符是因繼承才出現的。

理解隱藏

隱藏是指派生類別的函數屏蔽了與其同名的基底類別函數。規則如下:

  1. 如果衍生類別的函數與基底類別的函數同名,但是參數不同,此時,不論有無virtual關鍵字,則基底類別的函數將被隱藏。

  2. 如果衍生類別的函數與基底類別的函數同名,且參數也相同,但是基底類別函數沒有virtual關鍵字,此時,基底類別的函數被隱藏。

衍生類別的預設成員函數

在衍生類別中如果沒有顯示定義一下六個預設成員函數,編譯系統會預設合成這六個成員函數。

  1. 建構子

  2. 拷貝建構子

  3. ##析構函式

  4. #賦值運算子重載

  5. 取位址運算子重載

  6. const修飾的取位址運算子重載

  7. #
    #include<iostream>
    using namespace std;
    class person{
      public:
        person(const char* name)
          :_name(name)
        {
          cout<<"person()"<<endl;
        }
        person(const person& p){
          cout<<"person(const person& p)"<<endl;
        }
        person& operator=(const person& p){
          cout<<"person& operator=(const person& p)"<<endl;
          if(this!=&p){
            _name=p._name;
          }
          return *this;
        }
        ~person(){
         cout<<"~person()"<<endl; 
        }
      protected:
        string _name;
    };
    class student:public person{
      public:
        student(const char* name,int num)
          :person(name)
           ,_num(num){
             cout<<"student()"<<endl;
           }
        student(const student& s)
          :person(s)
           ,_num(s._num)
        {
          cout<<"student(const student& s)"<<endl;
        }
        student& operator=(const student& s){
          cout<<"student& operator=(const student& p)"<<endl;
          if(this!=&s){
            person::operator=(s);//必须指定域,否则会死循环
            _num=s._num;
          }
          return *this;
        }
        ~student(){//析构的时候先清理子类,再清理父类,不需要显示的调用
          cout<<"~student()"<<endl;
        }
      private:
        int _num;
    };
    int main(){
      student s1("jack",18);
      student s2(s1);
      student s3("rose",16);
      s1=s3;
    }
 菱形繼承

【C++】深入了解繼承方式基礎知識及其與存取限定符的關係

菱形繼承存在二義性以及資料冗餘問題。

例,下圖中繼承的資料為兩份,各不相同:

【C++】深入了解繼承方式基礎知識及其與存取限定符的關係

#解決方法:虛繼承

在菱形的第二層加入virtual

範例:

【C++】深入了解繼承方式基礎知識及其與存取限定符的關係

 相關文章:

##C#《拾遺之小知識》(四):繼承

C#基礎知識整理:基礎知識(2) 類別

相關影片:

##千鋒C語言基礎影片教學

以上是【C++】深入了解繼承方式基礎知識及其與存取限定符的關係的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn