C++ dynamic_cast
C++ dynamic_cast
class A
{
};
class B:public A
{
};
int main()
{
A a;
B b;
A *ap = &b;
B *bp = dynamic_cast<B*>(ap);
if(bp!= NULL)
cout<<"Pass"<<endl;
else
cout<<"Fail"<<endl;
return 0;
}
如果你想做一个动态投射,为什么A类应该是虚拟的?
dynamic_cast
的工作方式与static_cast
不同。static_cast
的结果始终是一个指针。但是,如果强制转换不正确(对于给定指针最初不是的类型(,则强制转换的结果是未定义的;指针不一定有效。因此,使用 static_cast
强制转换为派生类时存在一定程度的不确定性;没有任何机制可以阻止您投向错误的东西。
如果强制转换正确,dynamic_cast
将返回有效指针,如果转换不正确,则返回 null 指针。因此,在所有情况下,结果都是明确的。为此,dynamic_cast
必须是动态的。这意味着它必须对指针执行运行时检查,以查看要强制转换为的类型是否是合法的强制转换操作。
非虚拟类型进行强制转换,因为"按使用量付费"原则:没有虚函数的类型通常不是由其基类传递的类型。没有虚拟的继承主要是关于使用现有的实现,而不是关于专门的函数。即使是像虚拟析构函数这样简单的东西也足够了。
做dynamic_cast
所需的机器不是零的。因此,在"按使用量付费"的原则下,只有那些有用的课程才能为他们付费。IE:那些虚拟的类。
输出将是这样的:
错误 xxxx:
dynamic_cast
参数无效。类是非多态类型。
类必须是多态的,因为这是dynamic_cast
的规范。在内部,dynamic_cast
检查虚拟表指针,但这是一个实现细节。
在这种情况下,您可以使用static_cast
。
virtual
是多态性的关键。虚函数意味着它被派生类"覆盖",否则类之间没有多态性,只有继承。如果类不是多态的,则不能使用该dynamic_cast
。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理