Вызов конструктора копии после простого наследования

У меня есть сомнения относительно какой-то концепции наследования, я заявляю то, что знаю, пожалуйста, поправьте меня, если я ошибаюсь.

Закрытые члены базового класса наследуются производным классом, но производный класс не может получить к ним доступ любым способом.

Защищенные члены базового класса наследуются производным классом, но производный класс не может получить к нему прямой доступ, но с помощью некоторых его функций-членов.

Теперь в следующем коде:

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?

Почему мы не можем вызвать copy-constructor для объекта A?

Много много спасибо заранее

1 ответ

Решение

Доступ к защищенному члену может быть получен только другими членами того же завершенного объекта, во время строительства, разрушения или через this указатель (*).

В вашем примере иерархии классов, B объект имеет два подобъекта типа A:

  • Подобъект базового класса, который он получает, получая из A, а также
  • Подобъект члена данных с именем a, который он получает, декларируя a,

Член B может получить доступ только к защищенным членам с первого A подобъект, а не от второго, потому что только первый напрямую использует this указатель (обратите внимание, что ваше выражение cout << t семантически эквивалентно cout << this->t).

Доступ к членам данных члена не использует напрямую this указатель: если вы пытались получить доступ this->a.t от B::make, this указатель не используется напрямую для доступа к t, В вашей декларации A b(a); конструктор копирования вызывается не для this, но для нового A объект, который вы строите, локальная переменная с именем b,


(*) Или, конечно, любой член в классе, который объявляет это: любая функция-член B может вызвать любую другую функцию-член B

Другие вопросы по тегам