El siguiente código muestra un error de compilación para void b() { m = &A::a; };
que indica que A::a()
está protegido. (Lo cual es, pero eso no debería ser un problema)
Sin embargo, al compilador no le importa cuando escribo B::a()
. A pesar de que ambos significan lo mismo yo preferiría A::a()
porque establece explícitamente que a()
se define en A.¿Por qué no es posible almacenar un puntero de función de una clase base?
Así ¿cuál es la razón por la cual se prohíbe A::a()
?
EDITAR
Tal vez alguien puede encontrar un ejemplo que sería problemático si A::a()
se dejó en B::b()
. Si hay tal ejemplo, lo marcaré como respuesta a la pregunta.
/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
Explicación del código:
En B que desea almacenar un puntero de función a un método en el que A sea capaz de llamar a esto más adelante en B::c()
. Y sí, esto también sucede en la vida real. :-)
Divertido ... sucede tanto con 'gcc-3.4.2' y' gcc-4.3.2' –
puede estar relacionado para http://stackoverflow.com/questions/477829/cannot-call-base-class-protected-functions/477868#477868 – josefx