Можно ли наследовать от одного класса поля и методы разных модификаторов доступа в C++
Не нашёл никакой информации об этом. Можно ли наследовать от одного класса поля и методы разных модификаторов доступа?
Например есть такой класс:
class ClassA
{
protected:
int someVar;
void fun1();
public:
void setVar(int var);
int getVar();
};
Поля и методы роли не играют. Самое главное, что есть что-то с модификатором protected и public.
И нужно во втором классе наследовать как поля и методы с модификатором protected, так и public.
class ClassB : protected ClassA
{
private:
// Что-то новое в классе B
public:
// Что-то новое в классе B
};
В данном случае наследуются только поля и методы с типом protected, но можно написать и class ClassB : public ClassA, тогда будут наследоваться с модификатором public.
Я пишу небольшой проект с графикой, а этот код написал лишь для примера, но суть он отражает.
Нужно наследовать от класса поля и методы сразу с двумя модификаторами, но если написать что-то типа class ClassB : public ClassA, protected ClassA, то код не скомпилируется.
Возможно ли вообще в C++ такое наследование? Нигде не нашёл информации, везде пишут только о том как наследовать с одним модификатором, либо с разными модификаторами, но от нескольких разных классов.
Ответы (3 шт):
В данном случае наследуются только поля и методы с типом protected
Всегда наследуются все поля и методы.
От того, какое (public/private/protected) это наследование, зависит, кто будет иметь к ним доступ.
Наследуется всё. Но по-разному. По существу, модификатор наследования просто меняет доступ наследника к унаследованным членам.
Думаю, вам поможет такая табличка, в которой показано, что во что превращается.
Модификатор наследования
-------------------------------------------------------------
Модификатор члена | public | protected | private |
-------------------------------------------------------------
public | public | protected | private |
-------------------------------------------------------------
protected | protected | protected | private |
-------------------------------------------------------------
private | недоступен | недоступен | недоступен |
-------------------------------------------------------------
Так понятнее?
Все методы и поля наследуются:
class ClassA {
protected:
int someVar;
void fun1() {
cout << "ClassA::fun1()\n";
}
public:
void setVar(int var) {
cout << "ClassA::setVar()\n";
someVar = var;
}
int getVar() {
cout << "ClassA::getVar()\n";
return someVar;
}
};
class ClassB : public ClassA {
public:
void someNew() {
ClassA::fun1();
}
};
int main() {
ClassB b;
b.someNew();
b.setVar(8);
cout << b.getVar() << endl;
}
Как видите, все работает и все вызывается. Вы не можете вызвать ClassA::fun1() из main() - но это не из-за того, что она не наследуется, а потому что protected, т.е. вызывается только из класса и его наследников.