Функции с той же подписью в производном классе, но унаследованные как защищенные - PullRequest
0 голосов
/ 11 октября 2019

Функция базового класса и функция производного класса, имеющие одинаковую сигнатуру, но унаследованные как защищенные. В основном я назначил объект производного класса указателю базового класса, и я пытаюсь получить доступ к функции. Это вызывает ошибку. Это из-за защищенности?

 class base{

    public:
    void test(){
    cout<<"test in base\n";

    }
    };
    class derived:protected base{

    public:

     void test(){
    cout<<"test in derived\n";

    }

    };



    int main(){

    base *ptr;
    derived obj;
    ptr=&obj;
    ptr->test();

    return 0;
    }

ошибка:

In function 'int main()':

error: 'base' is an inaccessible base of 'derived'

     ptr=&obj;

          ^~~

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Поскольку вы используете защищенное наследование для внешнего мира, derived не является производным от base, только derived и его подклассы знают, что оно получено из base.

Следовательно:

base *ptr;
derived obj;
ptr=&obj;

Присваивает derived* совершенно не связанный тип base*. Если вы хотите, чтобы derived был преобразован в base, вам нужно использовать public наследование, protected наследование намеренно скрывает ваш базовый класс от внешнего мира.

0 голосов
/ 11 октября 2019

Редактировать Код в вопросе изменился, поэтому я изменил весь ответ:

как частное, так и защищенное наследование позволяет переопределять виртуальные функции в частной / защищенной базеclass, также не утверждает, что производная является своего рода базой. So ptr = & obj;не работает, потому что они не одного типа.

защищенное наследование позволяет производным классам производных классов знать об отношениях наследования. Таким образом, ваши внуки эффективно знакомы с вашими деталями реализации. Это имеет как преимущества (оно позволяет производным классам защищенного производного класса использовать связь с защищенным базовым классом), так и затраты (защищенный производный класс не может изменить отношение, не нарушая потенциально производные классы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...