Я столкнулся с проблемой в C++, для которой не могу найти нормального решения.
Проблему иллюстрирует следующий пример:
class Parent {
protected:
int f() = 0;
};
class Child : public Parent {
protected:
int g(Parent& p) {
return p.f(); // error: 'virtual int Parent::f()' is protected.
}
int g(Child& p) {
return p.f(); // OK.
}
};
Я хочу, чтобы метод f() был доступен только наследникам класса Parent. В реальной задаче метод f() виртуальный и наследники его замещают (override), но сути проблемы это не меняет.
Я знаю 2 плохих решения:
Сделать f() public. В данный момент его и использую. Этот решение плохое, потому что я не хочу давать доступ к f() кому-либо, кроме наследников.
Добавить всех наследников в друзья родителя. Тут 2 минуса: private члены родителя становятся доступны наследникам, и при добавлении нового наследника, мы становимся обязаны обновить базовый класс.
Нашел похожий вопрос на SO, но там никого нормального решения так и не нашлось.
Ответ
Как насчёт такого трюка: делегировать вызов f предку? (Проверка.)
class Parent {
protected:
virtual int f() = 0;
int CallFOn(Parent& p) { return p.f(); }
};
class Child : public Parent {
protected:
int g(Parent& p) {
return CallFOn(p); // OK.
}
int g(Child& p) {
return p.f(); // OK.
// или даже ( http://ideone.com/WLE27X )
// return CallFOn(p);
}
};
Комментариев нет:
Отправить комментарий