11

std::bind() を使用して、派生クラスのバージョンを呼び出すのではなく、仮想関数の基本クラス バージョンを呼び出す関数を作成しようとしています。

struct Base
{
    virtual void foo() { cout << "Base\n"; }
};

struct Derived : public Base
{
    virtual void foo() { cout << "Derived\n"; }
};

int main(int argc, const char * argv[])
{
    Base* base = new Derived;
    auto baseMethodHopefully = std::bind( &Base::foo, base );
    baseMethodHopefully();    // Want call to Base::foo(), but get call to Derived::foo().

    return 0;
}

通常、このような「反仮想」の方法で基本関数を呼び出すことはできないことを他の場所から理解しています。明らかな例外は、一般的なパラダイムです。

void Derived::bar() { Base::bar(); }

Base::bar()は Derived のメソッド内で (私が言及している意味で) "anti-virtual" として認識されるため、Derived のメソッドの 1 つから目的の方法でバインドすることは可能ですBase::bar()か? 例:

void Derived::bar()
{
    auto baseMethod = std::bind( &Base::foo, this );
    baseMethod();
}

もしそうなら、構文は何ですか?

4

1 に答える 1

17

さて、&Base::fooメンバ関数ポインタです。また、仮想オーバーライドを呼び出さないメンバー関数ポインターを使用する方法はありません。仮想オーバーライドを回避する唯一の構文は、クラス名、関数名、および引数リストがすべて同じ式にある構文です。

しかし、 がある場合はstd::bind、ラムダもある可能性が高いため、次を使用できます。

auto baseMethod = [this](){ return Base::foo(); };
//...
baseMethod();
于 2013-01-18T21:53:12.870 に答える