gpt4 book ai didi

c++ - 我无法理解 c 风格转换之间的区别(例如 :- A a;B *b;b = (*B) (&a);) and dynamic_cast(&a);

转载 作者:行者123 更新时间:2023-11-30 00:43:51 26 4
gpt4 key购买 nike

我在谷歌上搜索了有关 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 的内容。这导致 undefined behavior如果您尝试以任何方式取消引用 b

关于c++ - 我无法理解 c 风格转换之间的区别(例如 :- A a;B *b;b = (*B) (&a);) and dynamic_cast<B*>(&a);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com