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.
天蓬老师2017-04-17 14:26:28
ご招待ありがとうございます。
誰かがすでによく答えているので、ここでは dynamic_cast
の使用法について詳しく説明しません。
ここでは主に、dynamic_cast
を使用する必要がある理由について説明します。前の答えは、それがより安全であるというものです。
また、同じオブジェクトを指す異なる基本クラス ポインター間で変換する必要がある場合、dynamic_cast
を使用すると変換の正確さを保証できます。
さまざまなサブクラスのオブジェクトを指すことができる、基本クラス型のポインターもあります。ただし、2 つのサブクラス型のポインターが互いのオブジェクトを指すことはできません。変換するとエラーになります。現時点では、dynamic_cast
を使用して、実行時に基本クラス ポインターがどのサブクラス オブジェクトを指しているかを決定できます。
例を挙げてみましょう。 http://ideone.com/oUgVpo
リーリー伊谢尔伦2017-04-17 14:26:28
dynamic_cast には型チェックの機能があり、失敗した場合は bad_cast 例外がスローされます。 static_cast より安全です。static_cast はチェックなしで強制的に直接転送されます
大家讲道理2017-04-17 14:26:28
実験を繰り返した結果、親クラスに仮想関数を追加するか、デストラクターを仮想関数に設定するだけで済むことがわかりましたが、なぜこれが起こるのかわかりません...
伊谢尔伦2017-04-17 14:26:28
dynamic_cast 変換は、変換用の仮想テーブルの前にある type_info に基づいて行われます。dynamic_cast を使用できるのは、仮想関数を含むクラスだけです。
上記の type_info はコンパイル中にコンパイラによって生成されるため、コンパイル中に type_info が見つからない場合はエラーが報告されます。