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.
dynamic_cast 通常用於向下轉換檢查。例如
雷雷謝邀。
前面已經有人回答得很好了,這裡就不再對
dynamic_cast
的用法多做贅述了。這裡主要說為什麼要用到
dynamic_cast
,前面也右回答,是比較安全。還有,需要在指向同一個物件的不同基底類別指標之間的轉換,使用
dynamic_cast
能夠保證轉換的正確性。還有就是基底類別類型的指針,指向可以不同子類別物件。但是兩個子類別的指針,是不能指向對方的物件的。如果轉換,是會出錯的。這時候可以使用
dynamic_cast
在執行時判斷基底類別指標指向的是哪一個子類別的物件。舉個例子。 http://ideone.com/oUgVpo
dynamic_cast具有類型檢查的功能,失敗會拋出bad_cast異常。比static_cast安全,static_cast是不作任何檢查直接強轉的
經過我反覆試驗, 發現只要在父類中加入一個虛函數, 或者把析構函數設為虛函數就可以了, 但是並不知道為什麼會這樣...
最簡單的例子:
http://stackoverflow.com/ques...
dynamic_cast 轉換的依據是虛表前面的 type_info 進行轉換,只有包含虛函數的類別才可以使用 dynamic_cast 。
而且上述的 type_info 是在編譯期由編譯器生成,所以在編譯的時候,如果沒有找到 type_info,就會報錯。