Ich habe diese Frage erhalten, als ich einen Kommentar zur Codeüberprüfung erhielt, der besagt, dass virtuelle Funktionen nicht inline sein müssen.
Ich dachte, virtuelle Inline-Funktionen könnten in Szenarien nützlich sein, in denen Funktionen direkt für Objekte aufgerufen werden. Aber das Gegenargument kam mir in den Sinn: Warum sollte man virtuell definieren und dann Objekte verwenden, um Methoden aufzurufen?
Ist es am besten, keine virtuellen Inline-Funktionen zu verwenden, da diese sowieso fast nie erweitert werden?
Code-Snippet, das ich für die Analyse verwendet habe:
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()
könnte , dass dies als nicht virtueller Anruf gelöst werden könnte, könnte es diesen Anruf inline haben. Dieser referenzierte Aufruf wird von g ++ 3.4.2 eingefügt: TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
Ihr Code ist nicht.