C ++の継承と組み合わせ
継承と組み合わせ
二つのオブジェクトの組合せを得継承とメモリ構造が同一であるが、クラスオブジェクトと組み合わせて使用される場合、書き換えされる部分は、メンバ関数を含んでいる
、例えば:
組み合わせて使用する場合、オブジェクトのないメンバーがオーバーライド部材を得ることがあれば機能、私たちが使用する必要がある
オブジェクトのメンバーを取得するための情報m_Cperson.GetSex()とm_Cperson.GetNameを
継承とアクセス制御
注意:
- 上記の表「見えない」だけで、コンパイル時に親クラスのprivateメンバにアクセスするためのコードかどうかをチェックし、関係なく、継承、親クラスのどの方法の
サブクラス内のプライベートデータメンバとメンバ関数が表示されていません、継承は、サブクラスの親クラスメンバへのアクセスを再割り当てするために使用されます。 - 相続相続の時に指定されていない場合、デフォルトはprivate継承です
- 親クラスが非プライベートメンバ関数のプライベートデータメンバーを変更する必要がある場合は、親クラスのメンバ関数を変更することができます呼び出すためにこれらのサブクラスを呼び出す
親クラスのプライベートデータメンバーを。 - あなたは、サブクラスのオブジェクトを作成すると、オブジェクトが作成することである親クラスが前面に親クラスのオブジェクトを継承し、これは、互換性のためである
あなたは、サブクラス後で拡張の一員になりたい場合は、ちょうど尾に追加、前の手順は変更がまだ通常の訪問することができことはありません、これは
また、コンパイラはオフセット親オブジェクトを算出し、簡素化します。 - そして、データは、区別をオーバーロード機能を隠す:
データ隠蔽を:異なるスコープBはCの引数リストに同じ名前のメンバーが同じ...です
...異なるパラメータリストC Bと同じ名前で同じ機能の範囲:オーバーロード機能
アクセス方法の継承メンバ関数:
- 当写有子类对象调用函数的代码时,编译器先在子类的类域中寻找是否有该名称的函数,如果有这样的一个
或者多个函数名称挑,就选出最佳的 (这个过程与调用重载函数类似),如果有该名称的函数,但是参数列表
不匹配,这时就会报错,即使所继承的父类中有匹配的同名函数,编译器也不会在父类的类域中寻找. - 当写有子类对象调用函数的代码时,编译器先在子类的类域中寻找是否有该名称的函 数,如果子类的类域中
没有该名称的函数,那么编译器就去父类的类域中寻找是否有匹配的该名称函数,如果没有就报错 - 当子类和父类中有同名的函数时,当调用该函数时,默认的是优先调用子类的同名函数,其过程如上述第一
项所描述,如果要想调用父类的同名函数,只能在调用时在函数名前加上父类的类域
子类对象向父类对象的类型转换:
一个子类对象包含两大部分:子类自己定义的成员和继承的其它父类对象(当然可能还有组合对象),因为子类对
象中含有基类的部分,所以可以把子类对象当成父类对象来使用,还可以将指向父类对象的指针指向子类中的
父类部分。
例如:
CStudent * pstu = 新 CStudent (「XX」、 'F' 、7 ); CPerson * PPER = pstu 。 PPER - > GetSex ();
できなければプログラムの異常を生じる起こり得る危険、国境を越えたアクセスが、あるポインタがサブクラスオブジェクトのオブジェクトの親クラスを指すようにさせ
、親オブジェクトがサブクラスオブジェクトに含まれていると判断しました。
コンストラクタとデストラクタは、連続して注文します:
- 建設:親オブジェクトのコンストラクタは、最初で唯一の親オブジェクトのセクションの初期化するために、サブクラスのコンストラクタのリストに親クラスを初期化するコンストラクタを呼び出す
コンストラクタ独自のクラスのデータメンバでポイントを - デストラクタ:ファーストクラスのデストラクタ、親クラスのデストラクタは、サブクラスは、リソースの親クラスとして使用することもできます
コンストラクタとデストラクタ配列との組み合わせでの継承の使用:
まず、建設中に親クラスのコンストラクタを呼び出すオブジェクトのコンストラクタ呼び出しのメンバー、そして最終的に彼らのコンストラクタを呼び出して、デストラクタ最初のデストラクタが所有し、
オブジェクトのデストラクタのメンバーを呼び出し、最後に親クラスのデストラクタを呼び出します。