1. ホーム
  2. c++

[解決済み] インライン仮想関数は本当に無意味なのか?

2022-04-15 08:15:26

質問

コードレビューで仮想関数はインラインである必要はないというコメントをもらったときに、この質問を受けました。

インラインの仮想関数は、オブジェクトに対して直接関数を呼び出すような場合に便利だと思いました。しかし、「なぜvirtualを定義して、オブジェクトを使ってメソッドを呼び出したいのか」という反論が頭に浮かびました。

インラインの仮想関数は、どうせほとんど拡張されないので、使わないほうがいいのでしょうか?

解析に使用したコードスニペット

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;
}

解決方法は?

仮想関数はインライン化できる場合があります。優れた C++のよくある質問 :

インラインの仮想呼び出しが行われるのは をインライン化できるのは、コンパイラが オブジェクトの正確なクラスがわかっている。 のターゲットである仮想 関数を呼び出すことができます。このようなことが起こるのは コンパイラが実際のオブジェクト へのポインタや参照ではなく オブジェクトを作成します。すなわち、ローカル オブジェクト、グローバル/スタティックオブジェクト、または の中に完全に含まれるオブジェクトです。 コンポジット.quot。