J'ai eu cette question lorsque j'ai reçu un commentaire de révision de code disant que les fonctions virtuelles ne doivent pas nécessairement être en ligne.
Je pensais que les fonctions virtuelles en ligne pourraient être utiles dans les scénarios où les fonctions sont appelées directement sur des objets. Mais le contre-argument m'est venu à l'esprit: pourquoi voudrait-on définir le virtuel puis utiliser des objets pour appeler des méthodes?
Est-il préférable de ne pas utiliser les fonctions virtuelles en ligne, car elles ne sont pratiquement jamais développées de toute façon?
Extrait de code que j'ai utilisé pour l'analyse:
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()
pouvait être résolu comme un appel non virtuel, il pourrait avoir en ligne cet appel. Cet appel référencé est incorporé par g ++ 3.4.2: TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
Votre code ne l'est pas.