2

ソリューションの実装とダブル ディスパッチ/ビジター パターンは理解していますが、このパターンが必要なコンパイル時と実行時に何が起こるかわかりません。

たとえば、このコード:

#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、マシンコードをチェックしますか?)

4

1 に答える 1