1. ホーム
  2. c++

voidポインタへのダイナミックキャストの実用的な使い方はあるか?

2023-11-06 14:57:20

質問

C++では T q = dynamic_cast<T>(p); 構造は、ポインタ p を他のポインタ型にキャストします。 T の動的型の継承階層に現れる必要があります。 *p を継承する必要があります。それはすべて問題なく、うまくいきます。

しかし、このような場合にも dynamic_cast<void*>(p) を実行すると、単に "most derived object" へのポインタが返されます (C++11 の 5.2.7::7 を参照)。この機能はおそらくダイナミックキャストの実装ではタダで出てくるものだと理解していますが、実際に役に立つのでしょうか?結局のところ、その戻り型はせいぜい void* であるため、これは何の役に立つのでしょうか?

どのように解決するのですか?

この dynamic_cast<void*>() は、多重継承を扱う場合でも、確かに同一性を確認するために使用することができます。

このコードを試してみてください。

#include <iostream>

class B {
public:
    virtual ~B() {}
};

class D1 : public B {
};

class D2 : public B {
};

class DD : public D1, public D2 {
};

namespace {
    bool eq(B* b1, B* b2) {
        return b1 == b2;
    }

    bool eqdc(B* b1, B *b2) {
        return dynamic_cast<void*>(b1) == dynamic_cast<void*>(b2);
    }
};

int
main() {
    DD *dd = new DD();
    D1 *d1 = dynamic_cast<D1*>(dd);
    D2 *d2 = dynamic_cast<D2*>(dd);

    std::cout << "eq: " << eq(d1, d2) << ", eqdc: " << eqdc(d1, d2) << "\n";
    return 0;
}

出力します。

eq: 0, eqdc: 1