我正在尝试使用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;
}
我从elsewhere了解到你通常不会以“反虚拟”的方式调用基本功能。明显的例外是常见的范例:
void Derived::bar() { Base::bar(); }
由于表达式Base::bar()
在Derived的方法中被识别为“反虚拟”(在某种意义上我暗指),是否有可能以所需的方式从<{1}}绑定到<{1}} em>在 Derived的方法之一?例如。类似的东西:
Base::bar()
如果是这样,语法是什么?
答案 0 :(得分:14)
好吧,&Base::foo
是一个成员函数指针。并且无法使用不调用虚拟覆盖的成员函数指针。避免虚拟覆盖的唯一语法是类名,函数名和参数列表都在同一表达式中的语法。
但如果你有std::bind
,你可能也有lambda,所以也许你可以使用:
auto baseMethod = [this](){ return Base::foo(); };
//...
baseMethod();