1

Base & Derived クラスがあるとします。

class Base{
 private:
  int* _privateIntPtrB;
 protected:
  int* _protectedIntPtrB;
 public:
  //methods which use
  //_privateIntPtrB and _protectedIntPtrB

class Derived: public Base{
 private:
  int* _privateIntPtrD;
 protected:
  int* _protectedIntPtrB; //I am redeclaring this var
 public:
  //methods which use
  //_privateIntPtrD and _protectedIntPtrB

私の質問: クラスのメソッドでDerivedは、派生バージョンが_protectedIntPtrB使用されますか? (あると思いますが、確認したいです)。

メソッドがクラスによって再定義されない場合、クラス へのポインターによって使用されるDerivedのはどのバージョンですか?_protectedIntPtrBDerived

私が尋ねている理由 -クラスで別_protectedIntPtrBの方法で初期化し、派生クラスのすべてのインスタンスでDerivedそのバージョンを使用したい。_protectedIntPtrB

4

1 に答える 1

5

Derived クラスのメソッドでは、Derived バージョンが_protectedIntPtrB使用されますか?

はい、それは基本クラス_protectedIntPtrBのメンバーを隠します。( として修飾されている場合、基本クラス変数は引き続き使用できます)。DerivedDerived::_protectedIntPtrBBase::_protectedIntPtrB

_protectedIntPtrBメソッドが派生クラスによって再定義されない場合、派生クラスへのポインターによって使用されるのはどのバージョンですか?

基本クラス変数。派生クラスのデータ メンバーは、基本クラスからは利用できません。

私が尋ねている理由 - Derived クラスで別の方法で初期化し、Derived クラスのすべてのインスタンスで_protectedIntPtrBそのバージョンを使用したい。_protectedIntPtrB

通常、派生クラスの動作を基本クラスとは異なるものにする最善の方法は、仮想関数をオーバーライドすることです。達成したいことを正確に考えたほうがよいでしょう。どの動作を変更したいかを考え出し、それを仮想関数にカプセル化します。

于 2012-07-10T14:24:06.700 に答える