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;
   }

为什么 LINE 1 出现错误?

为什么我们不能为 A 的对象调用复制构造函数?

很多很多提前谢谢

4

1 回答 1

5

受保护的成员只能由同一完整对象的其他成员在构造、销毁期间或通过this指针(*)访问。

在您的示例类层次结构中,一个B对象有两个类型的子对象A

  • 基类子对象,它通过从A
  • 名为 的数据成员子对象a,它通过声明a.

的成员B只能从第一A个子对象访问受保护的成员,而不能从第二个子对象访问,因为只有第一个直接使用this指针(请注意,您的表达式cout << t在语义上等同于cout << this->t)。

访问数据成员的成员不直接使用this指针:如果尝试从 访问this->a.tB::make则不直接使用指针this访问t。在您的声明A b(a);中,复制构造函数的调用不是针对this,而是针对您正在构造的新A对象,名为 的局部变量b


(*) 或者,当然,通过声明它的类中的任何成员:任何成员函数都B可以调用任何其他成员函数B

于 2012-07-08T06:27:55.160 回答