我了解解决方案的实现和双重调度/访问者模式,但是我不了解在编译时和运行时我们需要这种模式会发生什么。
例如此代码:
#include <iostream>
class A {
public:
};
class B : public A {
};
class F {
public:
virtual inline void operator()(const A&) const noexcept {
std::cout << "FxA" << std::endl;
}
virtual inline void operator()(const B&) const noexcept {
std::cout << "FxB" << std::endl;
}
};
class G : public F {
public:
virtual inline void operator()(const A&) const noexcept {
std::cout << "GxA" << std::endl;
}
virtual inline void operator()(const B&) const noexcept {
std::cout << "GxB" << std::endl;
}
};
void by_const_ref(const F& f, const A& a) {
f(a);
}
int main() {
by_const_ref(F(), A());
by_const_ref(F(), B());
by_const_ref(G(), A());
by_const_ref(G(), B());
return 0;
}
如果没有双重调度,对by_const_ref的第二次和第四次调用将不会将B()解析为A对象。
从本文开始:https : //en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_in_C++我了解它涉及名称修改以及运行时的编译时和vtable解析,但我没有找到确切的方法。
对于名称修改部分,我查看了已编译的对象,但没有发现任何特殊之处。
对于vtable,我使用g ++ -fdump-lang-class对其进行了转储,并且看起来那里也没有太多信息。
因此,我的要求。我想了解到底发生了什么,以及也许如何检查这种行为(使用nm等工具,检查vtable,机器代码?)
您太深入了,这很简单。
C ++虚拟函数可基于单个参数的类型进行动态调度this
。顾名思义,双重调度是基于两个参数类型的动态调度。由于该语言不提供此功能,因此Visitor模式仅使用内置的一次调度两次,this
依次使用每个动态参数。
可以想象,通过继续进行此音乐椅游戏,直到一次完成所有动态参数this
并在最终调用之前正确分配了访问者,才能实现执行三重分配或更多次访问的访客。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句