Ho letto qualche volta (probabilmente su c.l.C++. Moderato) che le chiamate alle funzioni virtuali possono essere template. Ho provato qualcosa nelle seguenti righe.Chiamate virtuali utilizzando l'indirizzo di un membro virtuale puro. È legale?
#include <iostream>
template<class T, class FUN>
void callVirtual(T& t, FUN f){
(*t.*f)();
}
struct Base{
virtual ~Base(){}
virtual void sayHi()=0;
};
struct Derived : public Base{
void sayHi(){
std::cout << "Hi!" << std::endl;
}
};
void Test(){
Base* ptr = new Derived;
callVirtual(ptr,&Base::sayHi);
}
int main()
{
Test();
return 0;
}
Output:
Hi!
Procedimento templatized però dare l'indirizzo del metodo di base virtuale pura al momento della compilazione chiama il metodo corretto in fase di esecuzione. È legale in C++ standard prendere l'indirizzo di un membro virtuale puro?
Grazie in anticipo
EDIT-1: ho rimosso la seconda parte della domanda 'come funziona?'. Sembra che sia ciò che cattura l'attenzione.
EDIT-2: Ho cercato c.l.C++ moderati e sono imbattuto in questo link (http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/5ddde8cf1ae59a0d).. Il consenso sembra che dal momento che lo standard non lo limita, è vaild.
EDIT-3: Dopo aver letto l'articolo codeproject (grazie agli ovanes), sto pensando che i compilatori fanno un po 'di magia. Poiché le funzioni virtuali sono implementate tramite vtable (che è specifico del compilatore), l'assunzione dell'indirizzo di una funzione virtuale fornisce sempre l'offset nel vtable. A seconda del puntatore "this" utilizzato, viene richiamata la funzione appropriata (il cui indirizzo è all'offset). Non sono sicuro di come giustificarlo, poiché lo standard non dice nulla di simile!
Grazie. Conoscete una sezione dello standard C++ che menziona i puntatori a funzioni dei membri ai puri virtual. Ho provato a trovare, ma non sono riuscito a carpire dettagli specifici. Mi sembra che dal momento che sono consentiti i puntatori dei membri a un tipo incompleto, sono consentiti anche i puntatori dei membri ai puri-virtuali. – Abhay
Ho letto male la domanda. Aggiornerò la mia risposta –
+1 La tua risposta modificata si avvicina a una "risposta" a questa domanda :-). Comincio a pensare che prendere in considerazione le funzioni virtuali (pure o no) e invocarlo è più verso un aspetto definito dalla lingua. – Abhay