C++:: 指针 - 从基类转换为派生类
Posted
技术标签:
【中文标题】C++:: 指针 - 从基类转换为派生类【英文标题】:C++:: Pointers - Casting from Base class to Derived 【发布时间】:2015-11-15 17:38:21 【问题描述】:我看到一段代码看起来像这样:
class A
int foo;
;
class B : public A
int moo;
;
int main()
A *a = new A;
B *b = (B *)a; // <-- Isn't that risky to do?
b->moo = 5;
return 0;
变量moo从未通过B构造函数初始化,也没有为moo的地址分配内存,因此有可能通过修改moo,我们将访问分配的内存,负责程序中的其他内容。我不太擅长软件开发中使用的所有这些术语,但我相信这被称为未定义行为?
如果我在这里完全错了,请纠正和启发我,也请让我知道这样做是否安全。提前致谢。
【问题讨论】:
那段代码会导致未定义的行为,没有说会发生什么。 @Alexander 这就是为什么你应该对dynamic_cast
感到沮丧。
...所以“是的”,这是错误的。顺便说一句,你错过了新的删除,这也是错误的。
我认为“冒险”是轻描淡写的。
@LogicStuff 它会返回一个 NULL 指针,不是吗? _deviantfan 真的。感谢您指出。 _天顶 对。那么,你们中的一个人不应该作为答案做出回应,以便我们可以关闭这个问题吗?
【参考方案1】:
C++ 引入新类型转换的原因之一是 C 风格的类型转换在 C++ 上下文中是不安全的。在 C++ 中,您应该使用适当的类型转换,并且(几乎?)永远不要使用 C 风格的类型转换。
在这种情况下,没有演员表会有所帮助,因为您已经注意到它是未定义的行为。
【讨论】:
以上是关于C++:: 指针 - 从基类转换为派生类的主要内容,如果未能解决你的问题,请参考以下文章