1

継承の概念について疑問があります。私が知っていることを述べています。間違っている場合は訂正してください。

基本クラスのプライベートメンバーは派生クラスに継承されますが、派生クラスは決してそれらにアクセスできません。

基本クラスの保護されたメンバーは派生クラスに継承されますが、派生クラスは直接アクセスできませんが、そのメンバー関数の一部を使用します。

今、次のコードで:

class A
    {
        protected:
        A(const A&){}
        A operator=(const A &){}
        int t;
        public:
        A(int r)   {t=r;}
        A(){t=0;}
     };

class B : public A
      {
       A a;
      public:
      void make(void)
      {
         //A b(a);      //LINE 1 -------COPY CONSTRUCTOR BEING CALLED ---protected member of base class 
         cout<<t;   //LINE 2 -------protected member of base class 
      }
      };

   int main()
   {
        B b;
        b.make();
        return 0;
   }

なぜLINE1のエラーが発生するのですか?

Aのオブジェクトに対してcopy-constructorを呼び出せないのはなぜですか?

多くの人が事前に感謝します

4

1 に答える 1

5

this保護されたメンバーには、構築中、破棄中、またはポインター(*)を介して、同じ完全なオブジェクトの他のメンバーのみがアクセスできます。

クラス階層の例では、Bオブジェクトには次のタイプの2つのサブオブジェクトがありますA

  • から派生して取得する基本クラスのサブオブジェクトA、および
  • aを宣言することで取得する、という名前のデータメンバーサブオブジェクトa

のメンバーはB、最初のサブオブジェクトからのみ保護されたメンバーにアクセスできA、2番目のサブオブジェクトからはアクセスできません。これは、最初のサブオブジェクトのみがポインターを直接使用するためです(式は意味的にと同等でthisあることに注意してください)。cout << tcout << this->t

データメンバーのメンバーへのアクセスは、ポインターを直接使用しません。からthisアクセスしようとした場合、ポインターはに直接アクセスするために使用されません。宣言では、コピーコンストラクターはではなく、作成する新しいオブジェクトに対して、という名前のローカル変数として呼び出されます。this->a.tB::makethistA b(a);thisAb


(*)または、もちろん、それを宣言するクラス内の任意のメンバーによって:の任意のメンバー関数は、Bの任意の他のメンバー関数を呼び出すことができますB

于 2012-07-08T06:27:55.160 に答える