在简单继承之后调用copy-constructor

时间:2012-07-08 06:25:34

标签: c++ inheritance copy-constructor

我对遗传的一些概念有疑问,我说的是我所知道的,如果我错了,请纠正我。

基类的私有成员由派生类继承,但派生类无法以任何方式访问它们。

基类的受保护成员由派生类继承,但派生类不能直接访问它,而是通过其某些成员函数的帮助。

现在在以下代码中:

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的对象调用copy-constructor?

提前许多次

1 个答案:

答案 0 :(得分:5)

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

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

  • 基类子对象,它来自A
  • 名为a的数据成员子对象,它通过声明a得到。

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

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


(*)或者,当然,由类中任何声明它的成员:b的任何成员函数都可以调用B <的任何其他成员函数/ p>