【发布时间】:2014-05-05 18:47:58
【问题描述】:
考虑以下代码:
class A {
public:
virtual ~A() {}
};
class AA : public A {
};
////////////////////////////////////////
class B {
public:
virtual void f(const A &a) {
// code for A
}
};
class BB : public B {
public:
virtual void f(const AA &a) {
// code for AA
}
};
////////////////////////////////////////
int main() {
A *a = new AA;
B *b = new BB;
b->f(*a);
}
显然,vtables 的构造使得当上面运行时,// code for A 被执行。我正在寻找一种能够代替// code for AA执行的方法。
动机是这是一个代码库,最终用户经常需要编写 BB 形式的类,我希望这个过程尽可能简单(即用户不必使用 RTTI 来确定他们正在处理的 A 的派生类)。任何想法(以及来自任何版本的 C++ 标准的巫术)都将受到赞赏。
【问题讨论】:
-
可能是
b->*(BB::&f)(*a)之类的东西,甚至是明确转换static_cast<(void*)(const AA&)>(b->f)(*a)? -
问问自己,您是否真的需要将对
AA的引用传递给BB::f(),而不是仅仅传递对A的引用。反之亦然。 -
访客模式? (取决于有多少类派生自
A,以及集合更改的频率。) -
@AlanStokes 最终访问者模式 + 巧妙的模板元编程机制?
-
@par: 对,所以将对
A的引用传递给BB,然后从BB调用A上的方法,这将动态绑定到实例上的方法AA。我仍然不明白为什么这在您的用例中是不可能的。
标签: c++ virtual-functions