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++:: 指针 - 从基类转换为派生类的主要内容,如果未能解决你的问题,请参考以下文章

Part7 继承与派生 7.3基类与派生类类型转换

如何使用 C++ 中的模板编程从基类创建派生类?

从基类到派生类的静态转换后找不到成员函数

C ++ - 在运行时从基类指针识别派生类

从基类指针访问两个具有不同类型的派生成员变量。

从基类函数派生的类容器