Ich habe ein Problem bezüglich der Zugriffserklärungen unter g ++ (Version 5.1).Public Access-Deklaration wirkt sich nicht auf Mitgliedsfunktionszeiger aus?
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 ++ nicht mit dem obigen Code zu kompilieren:
test.cpp: In instantiation of ‘void exec(C*, Func) [with C = Derived; Func = void (Base::*)()]’: test.cpp:24:27: required from here
test.cpp:17:4: error: ‘Base’ is an inaccessible base of ‘Derived’ (c->*func)();
Auch wenn die Funktion selbst aufgerufen werden kann (d.doStuff();
) der Zeiger kann nicht verwendet werden, selbst wenn ich die Funktion als zugänglich deklarierte die Außenseite. Private Vererbung ist auch wichtig, bis zu einem gewissen Grad, weil die Derived
Klasse beschließt, nur eine bestimmte Gruppe von Mitgliedern aus Basis (en) zu offenbaren, die Schnittstellenimplementierungen IRL sind.
NB: Dies ist eine Frage über die Sprache, nicht Klasse Design.
kompilieren mit clang ++: D –
@GabrieldeGrimouard Das Programm ist falsch, clang sollte es auch (und tut es) ablehnen. – Barry
@Barry es war ein Witz :(und keine Clang ++ mit -std = C++ 11 kompilieren es auf meinem Computer –