请考虑下面的代码。通过函数指针静态调用虚函数
#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();
}
此代码递归调用相同B::f
方法,直到用完栈,而我想call
方法调用A::f
。也就是说,它应该静态地调用它,因为它会一般发生过,我只是写:
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
// ...
A::f();
// ...
}
};
我想有call
方法是前因素一些代码和“静态调用”这是常见的后原因以f
...
如何静态调用在运行时决定的虚拟函数?
在`B :: f`中,为什么你必须通过`call`和一个函数指针调用函数?为什么你不能只是`A :: f();`? (将“之前”和“之后”代码重构为一些常用函数或普通类) – 2010-12-03 13:08:48
这可能是我必须做的......方法`call`就是在这里来分解代码,但我有没有意识到我不能使用它,因为我打算...... – 2010-12-03 13:34:15