нельзя вызвать функции, защищенные базовым классом? - PullRequest
7 голосов
/ 25 января 2009

Я не могу вызвать защищенную функцию в моем базовом классе. Зачем? Это выглядит примерно так:

class B : B2
{
public:
  virtual f1(B*)=0;
protected:
  virtual f2(B*) { codehere(); }
}
class D : public B
{
public:
  virtual f1(B*b) { return f2(b); }
protected:
  virtual f2(B*b) { return b->f2(this); }
}

В msvc я получаю сообщение об ошибке C2248: «имя :: класс :: f2»: невозможно получить доступ к защищенному члену, объявленному в классе «имя :: класс»

В gcc я получаю сообщение об ошибке: 'имя виртуального int :: class :: f2 ()' защищено.

Почему это? Я думал, что смысл защищенных членов заключается в вызове производных классов.

1 Ответ

15 голосов
/ 25 января 2009

Защищенные функции-члены могут вызываться только внутри базового класса или в его производном классе. Вы не можете звонить им за пределами своего класса. Внешний вызов означает вызов функции-члена переменной с типом класса.

Так

virtual f1(B*b) { return f2(b); }

нормально, потому что f2 работает с самим классом. (вызывается изнутри)

Но

virtual f2(B*b) { return b->f2(this); }

не скомпилируется, потому что f2 работает с b, а не с самим классом D. (вызывается снаружи) Это незаконно.

Чтобы исправить это, B :: f2 должен быть публичным.

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