Можно ли наследовать от одного класса поля и методы разных модификаторов доступа в 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 шт):

Автор решения: HolyBlackCat

В данном случае наследуются только поля и методы с типом protected

Всегда наследуются все поля и методы.

От того, какое (public/private/protected) это наследование, зависит, кто будет иметь к ним доступ.

→ Ссылка
Автор решения: Harry

Наследуется всё. Но по-разному. По существу, модификатор наследования просто меняет доступ наследника к унаследованным членам.

Думаю, вам поможет такая табличка, в которой показано, что во что превращается.

                     Модификатор наследования
-------------------------------------------------------------
Модификатор члена |  public     |  protected  |  private    |
-------------------------------------------------------------
public            |  public     |  protected  |  private    |
-------------------------------------------------------------
protected         |  protected  |  protected  |  private    |
-------------------------------------------------------------
private           |  недоступен |  недоступен |  недоступен |
-------------------------------------------------------------

Так понятнее?

→ Ссылка
Автор решения: Mikhailo

Все методы и поля наследуются:

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, т.е. вызывается только из класса и его наследников.

→ Ссылка