4

C++ Gotchas の項目 45 からの引用:

まず、実行時チェックを実行しない可能性があるという点で、dynamic_cast は必ずしも動的であるとは限りません。派生クラス ポインター (または参照) からパブリック基本クラスの 1 つへの dynamic_cast を実行する場合、コンパイラーはキャストが成功することを静的に判断できるため、ランタイム チェックは必要ありません。もちろん、この場合、派生クラスからその公開基底クラスへの変換は事前定義されているため、いかなる種類のキャストも必要ありません。

上記の説明は、dynamic_cast が通常使用される場所であると思いました (したがって、実行時チェックを行うのでしょうか??)。

上記の引用と、dynamic_cast を使用する「典型的な」必要性との違いを誰か説明してもらえますか? これにより、いつ dynamic_cast を使用する必要があるか、および上記のシナリオで使用する必要がない理由について混乱しました。

4

2 に答える 2

4
class Base {
public:
    virtual ~Base() {}
    // ...
};

class Derived : public Base {
    // ...
};

「通常の使用」:

void foo(Derived*);

void f(Base* pb)
{
    if (Derived* pd = dynamic_cast<Derived*>(pb)) {
        foo(pd);
    }
}

「引用の上」:

void bar(Base*);

void f(Derived* pd)
{
    Base* pb = dynamic_cast<Base*>(pd); // the dynamic_cast is useless here
                                        //  because a Derived IS-A Base, always
    bar(pb); // Note: could as well call directly bar(pd); (implicit conversion)
}
于 2013-06-23T17:48:11.690 に答える
2

dynamic_cast主にダウンキャストクロスキャストに使用されます。落とし穴はアップキャストに言及しています。

構造体 B1、B2、D:B1、B2 を持つ:

  • アップキャスト: D* -> B1*、D* -> B2*
  • ダウンキャスト: D* <- B1*、D* <- B2*
  • クロスキャスト: B1* <-> B2* (最も派生したクラスが D の場合に機能します)。
于 2013-06-23T17:47:43.680 に答える