ソリューションの実装とダブル ディスパッチ/ビジター パターンは理解していますが、このパターンが必要なコンパイル時と実行時に何が起こるかわかりません。
たとえば、このコード:
#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 への 2 回目と 4 回目の呼び出しは B() を A オブジェクトに解決しません。
この記事から: https://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_in_C++名前マングリング、コンパイル時間、および実行時の vtable 解決が含まれることは理解していますが、正確な方法はわかりませんでした。
名前マングリングの部分については、コンパイルされたオブジェクトを調べましたが、特別なものは見つかりませんでした。
vtableについては、 g++ -fdump-lang-class でダンプしましたが、そこにも多くの情報があるようには見えませんでした。
したがって、私の要求。正確に何が起こったのか、おそらくこの動作をチェックする方法を理解したいと思います(nmなどのツールを使用して、vtable、マシンコードをチェックしますか?)