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

时间:2015-07-14 20:18:24

标签: 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)我读过的最佳解决方案涉及虚拟功能&#34;和 2)这个问题现在重定向的问题提到了它们并解释了它们为什么有用。

4 个答案:

答案 0 :(得分:3)

  

我发现我的Atom a实际上是Cu的实例

在C ++中,这实际上是不正确的。

因此...

  

我如何[{1}}对a对象进行类型转换?

......你做不到。

答案 1 :(得分:3)

从父级到子级的动态强制转换仅在指针级别有效。由于声明为Cu var;的变量为<{1}}对象分配完全的空间,因此它不适合Cu或其他内容。但是,Atom为指针对象分配空间,从技术上讲,它可以是指向任何东西的指针,因此在验证Cu* var;类型的对象实际上是指向Atom*的指针之后,你可以安全地Cu价值。您可以详细了解dynamic_cast<Cu*> here,特别是关于演员如果失败会发生什么的部分。

答案 2 :(得分:0)

您只能将指针强制转换为派生类对象。不是对象类型本身。

你的最后一次尝试是最接近这个(你有效地将指向父类的指针强制转换为指向子类的指针)但是我猜编译器检测到对象不能是多态的(如果你声明{就是这种情况) {1}}在堆上)

Atom a

答案 3 :(得分:0)

狗总是动物,但动物并不总是狗。 子类可以有父类没有的变量和/或方法。我相信你可以使用指针来强制转换它。