Eu recebi essa pergunta quando recebi um comentário de revisão de código dizendo que as funções virtuais não precisam estar embutidas.
Eu pensei que funções virtuais embutidas poderiam ser úteis em cenários em que funções são chamadas diretamente a objetos. Mas o contra-argumento me veio à mente: por que alguém iria querer definir virtual e depois usar objetos para chamar métodos?
É melhor não usar funções virtuais em linha, pois elas quase nunca são expandidas?
Fragmento de código que usei para análise:
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()
poderia ser resolvido como uma chamada não virtual, pode haver uma chamada em linha. Essa chamada referenciada é incorporada pelo g ++ 3.4.2: TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
Seu código não é.