この質問は、仮想関数をインラインにする必要がないというコードレビューコメントを受け取ったときに受けました。
インライン仮想関数は、関数がオブジェクトで直接呼び出されるシナリオで役立つと思いました。しかし、反論が私の頭に浮かびました-なぜ仮想を定義し、次にオブジェクトを使用してメソッドを呼び出す必要があるのでしょうか?
とにかく展開されることがほとんどないので、インライン仮想関数を使用しないのが最善でしょうか?
分析に使用したコードスニペット:
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()
非仮想呼び出しとして解決できる可能性があることを指摘できる場合は、その呼び出しをインライン化している可能性があります。この参照される呼び出しは、g ++ 3.4.2によってインライン化されTempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
ます。コードはインライン化されません。