Il seguente codice restituisce un errore di compilazione per void b() { m = &A::a; };
che indica che A::a()
è protetto. (Il che è - ma non dovrebbe essere un problema)
Tuttavia al compilatore non interessa quando scrivo B::a()
. Anche se entrambi lo stesso significato io preferirei A::a()
perché afferma esplicitamente che a()
è definito in A.Perché non è possibile memorizzare un puntatore a funzione di una classe base?
Quindi qual è la ragione per cui è vietato A::a()
?
EDIT
Forse qualcuno può trovare un esempio che potrebbe essere problematico se A::a()
è stato permesso in B::b()
. Se c'è un esempio, lo contrassegnerò come risposta alla domanda.
/EDIT
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdio>
class A {
protected:
void a(){ std::cout << "A::a()" << std::endl; };
};
typedef void (A::*f)();
class B : public A {
public:
void b() { m = &A::a; }; // wont compile
// void b() { m = &B::a; }; // works fine
void c() { (this->*m)(); };
protected:
f m;
};
int main(){
B b;
b.b();
b.c();
}
// compile with
// g++ -Wall main.cpp -o main
Spiegazione del codice:
In B Voglio memorizzare un puntatore a funzione a un metodo in A per essere in grado di chiamare che più tardi in B::c()
. E sì, questo succede anche nella vita reale. :-)
Divertente ... accade sia con 'gcc-3.4.2' che' gcc-4.3.2' –
può essere correlato a http://stackoverflow.com/questions/477829/cannot-call-base-class-protected-functions/477868#477868 – josefx