У меня возник этот вопрос, когда я получил комментарий к обзору кода, говорящий, что виртуальные функции не обязательно должны быть встроенными.
Я думал, что встроенные виртуальные функции могут пригодиться в сценариях, где функции вызываются непосредственно на объекты. Но контр-аргумент пришел мне на ум: зачем нужно определять виртуальные, а затем использовать объекты для вызова методов?
Лучше ли использовать встроенные виртуальные функции, так как они почти никогда не расширяются?
Фрагмент кода, который я использовал для анализа:
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 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;
}