c++ - 我无法理解 c 风格转换(例如:- A a;B *b;b = (*B) (&a);) 和 dynamic_cast 之间的区别(&一个);
问题描述
我在 google 上搜索了 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
is不是指向 的指针B
,所以您确实是在踢自己的脚,因为指针b
将指向不是 的东西B
。如果您尝试以任何方式取消引用,则会导致未定义的行为。b
推荐阅读
- java - 在不删除目标文件的情况下覆盖文件内容的最简单方法是什么?
- excel - 删除表中的所有行而不丢失公式信息vba
- swiftui - 有没有办法引用一组视图?
- python-3.x - 如何创建一个函数来检测缺失数据表示为“-999”并将其替换为与缺失数据相邻的平均数据
- python - 更高或更低的游戏
- winapi - 将 hFont (CreateFontA) 传递给 CreateWindowEx
- python-requests - 对 Google Book API 的 Python 请求。如何创建网址?
- javascript - 正则表达式在以第二次出现结束之前获取字符串
- jquery - php ajax请求有时会出错
- docker - 部署静态网站会加载旧版本