Cerco di implementare oggetti funtori polimorfici (classe base astratta pura e bambini) solo a scopo di comprensione. Il mio obiettivo è creare molti oggetti della classe base che utilizzano diverse implementazioni delle pure funzioni virtuali.C++ Comprensione dei polimorfismi dei polimeri
Quando creo un puntatore della classe base e lo assegno a una nuova classe figlio, non posso chiamare l'oggetto come una funzione. L'errore è:
main.cpp:29:7: error: ‘a’ cannot be used as a function
Ecco il codice:
#include <iostream>
class foo{
public:
virtual void operator()() = 0;
virtual ~foo(){}
};
class bar: public foo{
public:
void operator()(){ std::cout << "bar" << std::endl;}
};
class car: public foo{
public:
void operator()(){ std::cout << "car" << std::endl;}
};
int main(int argc, char *argv[])
{
foo *a = new bar;
foo *b = new car;
//prints out the address of the two object:
//hence I know that they are being created
std::cout << a << std::endl;
std::cout << b << std::endl;
//does not call bar() instead returns the error mentioned above
//I also tried some obscure variation of the theme:
//*a(); *a()(); a()->(); a->(); a()();
//just calling "a;" does not do anything except throwing a warning
a();
//the following code works fine: when called it print bar, car respectivly as expected
// bar b;
// car c;
// b();
// c();
delete b;
delete a;
return 0;
}
mia comprensione attuale è che "foo * A" memorizza l'indirizzo del della funzione dell'oggetto "bar" in un (come mostrato dalla la dichiarazione cout). Quindi dereferenziare che "* a" dovrebbe fornire l'accesso alla funzione a cui "a" sta puntando e "* a()" dovrebbe chiamarlo.
Ma non è così. Qualcuno può dirmi perché?