Ciao Forum,
Mi sto arrovellando sulla seguente questione, senza riuscire a capire come si fa. Ho una certa classe "CListItem" che contiene un puntatore a un metodo virtuale di un'altra classe "CObjBase" e fin qui tutto OK, posso assegnare e deferenziare il puntatore. Ma se da "CObjBase" derivo una classe, in questa classe ridefinisco la funzione virtuale e tento di prendere l'indirizzo della funzione ridefinita, ovviamente il compilatore protesta perché la funzione cui sto cercando di puntare non è più una funzione della classe base ma di una da essa derivata. Accludo il codice così come lo sto provando.
Il mio obiettivo è poter chiamare da "CListItem" le funzioni virtuali ridefinite nelle classi derivate da "CObjBase"; questo tipo di problema inizia a mettere un po' alle corde la mia non eccelsa conoscenza del C++ quindi non so vagliare più di tanto i risultati che trovo in rete. Mi pare, ma solo mi pare di aver capito che il C++ 99 non ha i costrutti per affrontare questo problema e ho letto di un ente che si chiama "funzionoide" ma è implementato solo sul C++11. Orbene, ho letto anche che il supporto al C++11 non è consolidato in gcc e che ha ancora qualche bachetto. Inoltre, ma questa è una sorta di cilegina sulla torta, non mi piace l'overkilling e se anche gcc implementasse perfettamente il C++11 io ci vorrei ricorrere solo se la soluzione in C++ standard fosse poco elegante (compreso rendere friend le classi, cose che detesto ma in caso di necessità ovviamente farei). Se invece non c'è alternativa, copincollerò (perché temo che non mi sarà comprensibile) con le dovute modifiche quello che vorrete suggerirmi.
Come sempre grazie mille per ogni suggerimento
class CListItem ;
class CObjBase ;
// =====================================
class CListItem
{
public :
void (CObjBase::*funptr)(const int, const int) ;
} ;
// .....................................
class CObjBase
{
public :
virtual void function (const int a, const int b) { }
} ;
// .....................................
class CObjDeri : public CObjBase
{
public :
void function (const int a, const int b) { }
} ;
// =====================================
int main ()
{
CListItem list_item ;
CObjBase mainobj_base ;
CObjDeri mainobj_deri ;
// OK
(list_item.funptr) = &(mainobj_base.function) ;
// Ovviamente dà errore :(
(list_item.funptr) = &(mainobj_deri.function) ;
// Fine
return (0) ;
}