У меня проблема с объявлениями доступа в g++ (версия 5.1).
class Base
{
public:
void doStuff() {}
};
class Derived : private Base
{
public:
// Using older access declaration (without using) shoots a warning
// and results in the same compilation error
using Base::doStuff;
};
template<class C, typename Func>
void exec(C *c, Func func)
{
(c->*func)();
}
int main()
{
Derived d;
// Until here, everything compiles fine
d.doStuff();
// For some reason, I can't access the function pointer
exec(&d,&Derived::doStuff);
}
g++ не удается скомпилировать вышеуказанный код с помощью:
test.cpp: при создании экземпляра 'void exec (C *, Func) [с C = Derived; Func = void (Base:: *)()]: test.cpp: 24: 27: требуется отсюда
test.cpp: 17: 4: ошибка: "База - это недоступная база" Производные (С → * FUNC)();
Даже когда сама функция может быть вызвана (d.doStuff();
), указатель нельзя использовать, хотя я объявлял функцию доступной извне.
Частное наследование также важно, в какой-то мере, потому что класс Derived
выбирает для отображения только определенный набор элементов из базы (ов), которые являются реализациями интерфейса IRL.
NB: это вопрос о языке, а не о дизайне класса.