【发布时间】:2010-12-03 13:02:56
【问题描述】:
请考虑以下代码。
#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();? (将“之前”和“之后”代码重构为一些通用函数或通用类。) -
这可能是我必须要做的... 方法
call只是在这里分解代码,但我没有意识到我无法按照我的意图使用它...