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 的方法中被识别为“反虚拟”(在我所指的意义上),是否可以从 DerivedBase::bar()方法之一中以所需的方式绑定到?例如:

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

如果是这样,语法是什么?

4

1 回答 1

17

嗯,&Base::foo是一个成员函数指针。并且没有办法使用不调用虚拟覆盖的成员函数指针。避免虚拟覆盖的唯一语法是类名、函数名和参数列表都在同一个表达式中的语法。

但是如果你有std::bind,你可能也有 lambdas,所以也许你可以使用:

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