如何正确地将父类作为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)这个问题现在重定向的问题提到了它们并解释了它们为什么有用。
答案 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)
狗总是动物,但动物并不总是狗。 子类可以有父类没有的变量和/或方法。我相信你可以使用指针来强制转换它。