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 ...
如何静态调用在运行时决定的虚函数?
那是意料之中的。对象表达式是对基类A的引用,因此当A :: f是虚拟的时,将触发虚拟功能机制(动态绑定)。
只有::运算符可以支持虚拟函数调用机制。
$ 10.3 / 12-“使用范围运算符(5.1)的显式资格抑制了虚拟调用机制。”