Проблемы с публичным / защищенным / частным наследованием
Я пытаюсь простой пример наследования в C++. Но я просто не могу получить это. Когда я пытаюсь получить защищенных членов класса B
унаследованный от класса A
это говорит о том, что A::baz
защищен
#include <iostream>
class A {
public:
int foo;
int bar;
protected:
int baz;
int buzz;
private:
int privfoo;
int privbar;
};
class B : protected A {}; // protected members go to class B, right?
int main() {
B b;
b.baz; // here is the error [A::baz is protected]
}
Я не могу понять, что я делаю неправильно. Я пытался изменить class B : protected A
в : public A
но это все еще не работает.
7 ответов
Защищенное наследование просто влияет на то, как клиенты вашего класса видят открытый интерфейс базового класса. Защищенное наследование помечает общедоступных членов базового класса как защищенных для пользователей вашего унаследованного класса.
Так baz
в вашем примере это не публично, оно защищено от B, отсюда и ошибка компилятора.
Вы можете получить доступ protected
члены из производного класса, а не снаружи.
class B : protected A
{
void foo()
{
int x = foo; //ok
x = baz; //ok
x = privfoo; //error
}
};
Тип наследования ограничивает только доступ к базовому классу. Если, например, вы выбираете protected
наследство, все public
методы в A
станет protected
наружу, а остальные остаются прежними.
Спецификатор защищенного доступа похож на приватный. Единственное его отличие на самом деле происходит с наследованием. Когда класс наследует от другого, члены производного класса могут получить доступ к защищенным членам, унаследованным от базового класса, но не к его закрытым членам.
Подробнее об этом здесь
Доступ к защищенным полям возможен только с помощью методов в классе, который их объявляет, или классов, унаследованных от того, чтобы объявить класс. вы пытаетесь получить доступ к защищенному полю из глобальной функции.
Так как A::baz
защищен, B
может получить к нему доступ:
class B : public A
{
public:
int some_other_method()
{
return baz;
}
};
но это не позволяет другому коду получить к нему доступ.
Вы должны прочитать о публичном / частном наследовании в C++. То, что вы хотите достичь, сделано путем замены
class B : protected A {};
от
class B : public A {};
РЕДАКТИРОВАТЬ: я читал слишком быстро и не заметил, что вы пытались получить доступ baz
от основного. Вы можете получить к нему доступ только из метода-члена.
Когда участник protected
, к нему можно получить доступ только из методов класса, который определяет его и его потомков.
То, что вы пытаетесь сделать, это получить доступ к protected/private
члены из кода, внешнего для этих классов, что недопустимо. Вы можете получить доступ только public
члены класса вне области видимости класса.