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
#include "s.h"
int main(){
//std::shared_ptr x(new S);
//std::shared_ptr y = std::dynamic_pointer_cast(x);
P* x = new S;
S* y = dynamic_cast(x);
}
结果报错 :
main.cpp:8:12: error: 'P' is not polymorphic
S* y = dynamic_cast(x);
^ ~
1 error generated.
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
dynamic_cast is typically used for down-cast check. e.g.
dynamic_cast具有类型检查的功能,失败会抛出bad_cast异常。比static_cast更安全,static_cast是不作任何检查直接强转的
经过我反复试验, 发现只要在父类中加入一个虚函数, 或者把析构函数设为虚函数就可以了, 但是并不知道为什么会这样...
最简单的例子:
dynamic_cast 转换的依据是虚表前面的 type_info 进行转换,只有包含虚函数的类才可以使用 dynamic_cast 。
而且上述的 type_info 是在编译期由编译器生成,所以在编译的时候,如果没有找到 type_info,就会报错。