c++ - 在 C++ 中将父类类型转换为子类

标签 c++ oop polymorphism

<分区>

如何在 C++ 中正确地将父类类型转换为子类?

例如,如果我有两个类,

  Atom   ->   Cu
(Parent)    (Child)

并且我已经确定我有一个 Atom a 实际上是 Cu 的一个实例,然后我如何将 a 类型转换为Cu 对象?


到目前为止我尝试了什么:

Cu c = (Cu) a
-> No matching conversion for C-style cast from 'Atom' to 'Cu'

Cu c = Cu (a)
-> No matching conversion for functional-style cast from 'Atom' to 'Cu'

Cu c = static_cast<Cu>(a)
-> No matching conversion for static_cast from 'Atom' to 'Cu'

Cu c = dynamic_cast<Cu*>(&a)
-> 'Atom' is not polymorphic

编辑:一个(粗略的)解决方案

这是一段可以完成我所需要的工作代码:

// Overrides Atom::equals(Atom* other)
bool Cu::equals(Atom* a) {
    // checks to see if a is a Cu pointer
    if(other->getID() == "Cu") {
        // If so, typecasts it
        Cu* c = (Cu*) a;
        // Checks functions specific to Cu atoms
        ...
    }
}

编辑 2

我已将此问题标记为重复,因为 1)我读过的最好的解决方案涉及“虚拟功能”,并且 2) 这个问题现在重定向到的问题提到了它们并解释了它们为什么有用。

最佳答案

从父到子的动态转换仅在指针级别有效。由于变量声明为 Cu var;Cu 分配恰好 足够的空间对象,它不适合 Atom或者是其他东西。但是,Cu* var;为指针对象分配空间,从技术上讲,它可以是指向任何东西的指针,因此在验证类型为 Atom* 的对象之后实际上是指向 Cu 的指针,您可以安全地dynamic_cast<Cu*>值(value)。您可以阅读有关 dynamic_cast 的信息详细here ,特别是关于如果转换失败会发生什么的部分。

关于c++ - 在 C++ 中将父类类型转换为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31416474/

相关文章:

c++ - 尝试调用默认构造函数时没有匹配的构造函数

java - 面向对象编程比较链表

c++ - 确保正确释放 C++ 对象

从公共(public)基类派生的函数传递和返回 C++ 对象

c++ - 如何跟踪光位的变化?

C++ 使用纯虚函数接收错误, "variable or field ' x' 声明为 void"

c++ - 对虚拟表、构造函数和析构函数的 undefined reference

java - 多态——调用基类函数

c++ - C++中指针的地址

C++11 std::promise 的段错误