1

私が次を持っているとしましょう:

struct Base
{
    virtual void callback() { /* */ }
};

struct Derived : public Base
{
    void callback() { /* */ }
};

Base* obj = new Derived;
static_cast<Derived*>(obj)->callback();

コールバックの呼び出しは、関数シグネチャで仮想としてマークされていないため、vtableまたはストレート関数呼び出しを介して呼び出されますか?

4

1 に答える 1

4

Derived::callback同じ戻り型とパラメーターを持つ関数がとして宣言されているvirtualため、暗黙的にです。Base::callbackvirtual

とはいえ、vtableが使用されるかどうかは、コンパイラーとそれが実行する最適化に依存します。コンパイラはここでオブジェクトをobj指すことを知ることができるDerivedため、仮想関数の最終的なオーバーライドが何であるかを知っているcallbackため、vtableで関数を検索せずに呼び出しを行う可能性があります。ただし、そうするかどうかは、コンパイラと最適化の設定によって異なります。

于 2011-02-07T18:10:17.540 に答える