検索

ホームページ  >  に質問  >  本文

关于C++中的dynamic cast的使用

C++ primer中看到这个dynamic cast, 有点搞不太懂. 这个dynamic cast的作用到底是干嘛? 如果说一个父类指针中实际指向一个子类的话, 如果用这个指针调用一个虚函数, 就算没有dynamic-cast也会发生动态绑定吧? 如果用这个指针调用一个子类独有的函数, 那么这里应该用static cast, 好像和dynamic cast 也没什么关系? 那就不懂了, dynamic cast到底有什么用...

按照1L的回复我写了如下代码 :

//p.h
class P{

};

//s.h
#include "p.h"

class S : public P{

};

//main.cpp
#include <iostream>
#include "s.h"

int main(){
    //std::shared_ptr<P> x(new S);
    //std::shared_ptr<S> y = std::dynamic_pointer_cast<S>(x);
    P* x = new S;
    S* y = dynamic_cast<S*>(x);
}

结果报错 :

main.cpp:8:12: error: 'P' is not polymorphic
    S* y = dynamic_cast<S*>(x);
           ^                ~
1 error generated.
阿神阿神2804日前625

全員に返信(7)返信します

  • 怪我咯

    怪我咯2017-04-17 14:26:28

    dynamic_cast は通常、ダウンキャスト チェックに使用されます。例:

    リーリー

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:26:28

    ご招待ありがとうございます。
    誰かがすでによく答えているので、ここでは dynamic_cast の使用法について詳しく説明しません。

    ここでは主に、dynamic_cast を使用する必要がある理由について説明します。前の答えは、それがより安全であるというものです。
    また、同じオブジェクトを指す異なる基本クラス ポインター間で変換する必要がある場合、dynamic_cast を使用すると変換の正確さを保証できます。
    さまざまなサブクラスのオブジェクトを指すことができる、基本クラス型のポインターもあります。ただし、2 つのサブクラス型のポインターが互いのオブジェクトを指すことはできません。変換するとエラーになります。現時点では、dynamic_cast を使用して、実行時に基本クラス ポインターがどのサブクラス オブジェクトを指しているかを決定できます。

    例を挙げてみましょう。 http://ideone.com/oUgVpo

    リーリー

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:26:28

    dynamic_cast には型チェックの機能があり、失敗した場合は bad_cast 例外がスローされます。 static_cast より安全です。static_cast はチェックなしで強制的に直接転送されます

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:26:28

    実験を繰り返した結果、親クラスに仮想関数を追加するか、デストラクターを仮想関数に設定するだけで済むことがわかりましたが、なぜこれが起こるのかわかりません...

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 14:26:28

    最も単純な例:

    リーリー

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 14:26:28

    http://stackoverflow.com/ques...

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:26:28

    dynamic_cast 変換は、変換用の仮想テーブルの前にある type_info に基づいて行われます。dynamic_cast を使用できるのは、仮想関数を含むクラスだけです。

    上記の type_info はコンパイル中にコンパイラによって生成されるため、コンパイル中に type_info が見つからない場合はエラーが報告されます。

    返事
    0
  • キャンセル返事