我无法理解c样式铸造之间的区别(例如:- A a;B *b;b = (*B) (&a);)和dynamic_cast<B*>(和a);
I am not able to understand the difference between c style casting(for ex:- A a;B *b;b = (*B) (&a);) and dynamic_cast<B*>(&a);
我在谷歌上搜索了dynamic_cast,我发现显式强制转换基类对象以派生类指针可能是不安全的。 但是当我运行一些示例代码来检查这一点时,我没有收到任何错误。 请在下面找到我的代码:
class A
{
virtual void get(){}
};
class B : public A
{
public: void print(void)
{
cout << "In B's print" << endl;
}
void get()
{
cout <<" In B's get" << endl;
}
};
int main()
{
A a;
//A *a1 = &a;
B* b;
b = (B*)(&a);//c-style casting base class object to derive class pointer
b->print();
/*b = dynamic_cast<B*>(&a); // dynamic casting base class object to derive class pointer
if(b)
b->print();
else
cout << "failed" << endl;*/
}
Run: c++ cast.cpp
Run: ./a.out
o/p:- In B's print
据我所知,b->print(( 应该失败,因为基类没有关于派生类的所有信息。
如果我用dynamic_cast运行相同的代码,它将在强制转换后返回 null,并且输出将失败。
有人可以消除我的疑虑吗?如果有任何错误或不适当之处,也请纠正我。
有了dynamic_cast
,你可以得到一个运行时检查,你投射的内容确实可以强制转换为你想要的。
对于 C 风格的强制转换,你基本上告诉编译器"我知道我在做什么,不要妨碍我"。如果你犯了错误,这是搬起石头砸自己的脚的好方法。C 型石膏类似于reinterpret_cast
但安全性较低。
在这种情况下,因为&a
不是指向B
的指针,您确实会向自己的脚开枪,因为指针b
指向不是B
的东西。如果您尝试以任何方式取消引用b
,则会导致未定义的行为。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中