継承メソッドとアクセス修飾子の関係
3 つの継承メソッド:
パブリック継承
保護されたメンバー修飾子: 一部の基本クラス メンバーは、基本クラスのオブジェクトから直接アクセスされることを望まないが、派生クラスでアクセスする必要があるため、保護されたメンバーとして定義されます。保護されたメンバー修飾子は継承のために発生します。
非表示について理解する
非表示とは、派生クラスの関数が同じ名前の基本クラスの関数をブロックすることを意味します。規則は次のとおりです。
6 つのデフォルトのメンバー関数が派生クラスで明示的に定義されていない場合、コンパイル システムはデフォルトでこれらの 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; }
#ダイヤモンドの継承には、あいまいさとデータの冗長性の問題があります。
たとえば、次の図の継承されたデータは 2 つのコピーであり、それぞれ異なります。解決策: 仮想継承
ダイヤモンド 2 番目の層に virtual を追加します。 例:関連記事:
C# 欠落アイテムに関するヒント (4) ):
Qianfeng C言語の基礎ビデオチュートリアル
以上が[C++] 継承の基本知識とアクセス修飾子との関係についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。