Вызов защищенного метода в базовом классе через указатель на базовый класс в производном классе - PullRequest
4 голосов
/ 02 сентября 2010

Я хотел бы понять, почему, когда я вызываю защищенный метод, объявленный и реализованный в базовом классе, из производного класса через указатель на базовый класс, я получаю ошибку компиляции (C2248) и когда я вызываю его из производного класса через указатель на производный классэкземпляр, этап компиляции.

Я понимаю, что это часть языка, но я хочу понять, почему

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

например

class Base 

{

protected:

   virtual void func() {}

}

class Derived : public Base

{

public:

   virtual void myMethod()

   {

      Base* pBase = new Base;

      pBase->func();          -> compilation error (C2248)

      Derived* pDerived = new Derived;

      pDerived->func();       -> O.K

    }
}

1 Ответ

3 голосов
/ 02 сентября 2010

Сбой строки не компилируется, потому что вы обращаетесь к экземпляру Base - таким способом доступны только открытые методы. Если вы сделаете это в myMethod ():

Base::func();

он должен скомпилироваться, потому что теперь мы получаем доступ к унаследованному методу для this. Странно, что pDerived::myMethod() вызывает конструктор Derived?

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