Ho un problema riguardante le dichiarazioni di accesso in g ++ (versione 5.1).La dichiarazione di accesso pubblico non influisce sui puntatori di funzioni dei membri?
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 ++ non riesce a compilare il codice precedente con:
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)();
Anche quando la funzione stessa può essere chiamato (d.doStuff();
) il puntatore non può essere utilizzata anche se ho dichiarato la funzione accessibile da l'esterno. L'ereditarietà privata è anche importante, in una certa misura, perché la classe Derived
sceglie di esporre solo un determinato insieme di membri dalla/e base/e che sono implementazioni dell'interfaccia IRL.
NB: questa è una domanda sulla lingua, non sul design della classe.
compile con clang ++: D –
@GabrieldeGrimouard Il programma è sbagliato, clang dovrebbe (e lo fa) rifiutarlo anche. – Barry
@Barry era uno scherzo :(e nessun clang ++ con -std = C++ 11 lo compilo sul mio computer –