ホームページ  >  記事  >  バックエンド開発  >  [C++] 継承の基本知識とアクセス修飾子との関係についての深い理解

[C++] 継承の基本知識とアクセス修飾子との関係についての深い理解

php是最好的语言
php是最好的语言オリジナル
2018-07-30 11:32:012744ブラウズ

継承メソッドとアクセス修飾子の関係

3 つの継承メソッド:

  1. パブリック継承

  2. プライベート継承

  3. #保護された継承

  4. #関係: 基本クラスのメンバー関数がプライベートの場合、派生クラスの基本クラスのプライベート メンバーが非表示である場合、他の基準は最終的なアクセスのための小さな選択範囲に制限されます。

保護されたメンバー修飾子: 一部の基本クラス メンバーは、基本クラスのオブジェクトから直接アクセスされることを望まないが、派生クラスでアクセスする必要があるため、保護されたメンバーとして定義されます。保護されたメンバー修飾子は継承のために発生します。

非表示について理解する

非表示とは、派生クラスの関数が同じ名前の基本クラスの関数をブロックすることを意味します。規則は次のとおりです。

    派生クラスの関数が基本クラスの関数と同じ名前で、パラメーターが異なる場合、この時点では、基本クラスは、virtual キーワードに関係なく非表示になります。
  1. 派生クラスの関数の名前が基本クラスの関数と同じで、パラメータも同じであるが、基本クラスの関数に virtual キーワードがない場合の場合、基本クラスの関数は非表示になります。
  2. 派生クラスのデフォルトのメンバー関数

6 つのデフォルトのメンバー関数が派生クラスで明示的に定義されていない場合、コンパイル システムはデフォルトでこれらの 6 つのメンバー関数を合成します。 。

    コンストラクター
  1. コンストラクターのコピー
  2. デストラクター
  3. 代入演算子のオーバーロード
  4. アドレス演算子のオーバーロード
  5. const 変更アドレス演算子のオーバーロード
  6. #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;
    }
  7. ダイヤモンドの継承

#ダイヤモンドの継承には、あいまいさとデータの冗長性の問題があります。 [C++] 継承の基本知識とアクセス修飾子との関係についての深い理解

たとえば、次の図の継承されたデータは 2 つのコピーであり、それぞれ異なります。

解決策: 仮想継承[C++] 継承の基本知識とアクセス修飾子との関係についての深い理解

ダイヤモンド 2 番目の層に virtual

を追加します。 例:

関連記事: [C++] 継承の基本知識とアクセス修飾子との関係についての深い理解

C# 欠落アイテムに関するヒント (4) ):

#C#の継承 基礎知識整理:基礎知識(2) カテゴリ

関連動画:

Qianfeng C言語の基礎ビデオチュートリアル

以上が[C++] 継承の基本知識とアクセス修飾子との関係についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。