通过函数指针静态调用虚函数

Xav*_*det 5 c++ virtual static

请考虑以下代码.

#include <iostream>
#include <memory>

struct A {
  A() {}
  virtual void f() {
    std::cout << "A::f" << std::endl;
  }
private:
  A(const A&);
};

struct B : public A {
  virtual void f() {
    std::cout << "B::f" << std::endl;
    call(&A::f);
  }
private:
  void call(void (A::*aMethod)()) {
    // ...
    (static_cast<A&>(*this).*aMethod)();
    //(static_cast<A>(*this).*aMethod)();  -> not allowed to copy!
    // ...
  }
};

void main() {
  std::auto_ptr<B> b (new B);
  b->f();
}
Run Code Online (Sandbox Code Playgroud)

这段代码递归调用相同的B::f方法,直到它用完堆栈,而我希望call调用该方法A::f.也就是说,它应该静态地调用它,就像我简单写的那样:

struct B : public A {
  virtual void f() {
    std::cout << "B::f" << std::endl;
    // ...
    A::f();
    // ...
  }
};
Run Code Online (Sandbox Code Playgroud)

我想要使​​用该call方法的原因是在"静态调用"之前和之后考虑一些代码,这些代码对于具有相同签名的几个方法是通用的.f ...

如何静态调用在运行时决定的虚函数?

Chu*_*dad 5

那是意料之中的。对象表达式是对基类A的引用,因此当A :: f是虚拟的时,将触发虚拟功能机制(动态绑定)。

只有::运算符可以支持虚拟函数调用机制。

$ 10.3 / 12-“使用范围运算符(5.1)的显式资格抑制了虚拟调用机制。”