Ho ricevuto questa domanda quando ho ricevuto un commento di revisione del codice che diceva che le funzioni virtuali non dovevano essere in linea.
Ho pensato che le funzioni virtuali inline possano tornare utili in scenari in cui le funzioni vengono chiamate direttamente sugli oggetti. Ma la controargomentazione mi è venuta in mente è: perché si dovrebbe definire virtuale e quindi usare oggetti per chiamare metodi?
È meglio non usare le funzioni virtuali inline, dato che non sono quasi mai espanse comunque?
Snippet di codice che ho usato per l'analisi:
class Temp
{
public:
virtual ~Temp()
{
}
virtual void myVirtualFunction() const
{
cout<<"Temp::myVirtualFunction"<<endl;
}
};
class TempDerived : public Temp
{
public:
void myVirtualFunction() const
{
cout<<"TempDerived::myVirtualFunction"<<endl;
}
};
int main(void)
{
TempDerived aDerivedObj;
//Compiler thinks it's safe to expand the virtual functions
aDerivedObj.myVirtualFunction();
//type of object Temp points to is always known;
//does compiler still expand virtual functions?
//I doubt compiler would be this much intelligent!
Temp* pTemp = &aDerivedObj;
pTemp->myVirtualFunction();
return 0;
}
pTemp->myVirtualFunction()
potrebbe essere risolto come chiamata non virtuale, potrebbe essere inline quella chiamata. Questa chiamata referenziata è sottolineata da g ++ 3.4.2: il TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
tuo codice non lo è.