Recibí esta pregunta cuando recibí un comentario de revisión de código que decía que las funciones virtuales no necesitan estar en línea.
Pensé que las funciones virtuales en línea podrían ser útiles en escenarios donde las funciones se invocan directamente en los objetos. Pero el contraargumento me vino a la mente: ¿por qué querríamos definir lo virtual y luego usar objetos para llamar a los métodos?
¿Es mejor no usar funciones virtuales en línea, ya que casi nunca se expanden de todos modos?
Fragmento de código que utilicé para el análisis:
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()
podría resolverse como una llamada no virtual, podría tener esa llamada en línea. Esta llamada referenciada está en línea con g ++ 3.4.2: TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
su código no lo está.