Вызов конструктора копии после простого наследования
У меня есть сомнения относительно какой-то концепции наследования, я заявляю то, что знаю, пожалуйста, поправьте меня, если я ошибаюсь.
Закрытые члены базового класса наследуются производным классом, но производный класс не может получить к ним доступ любым способом.
Защищенные члены базового класса наследуются производным классом, но производный класс не может получить к нему прямой доступ, но с помощью некоторых его функций-членов.
Теперь в следующем коде:
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