0

我在命名空间中有一个全局函数,这个函数是一个辅助函数,它将创建对象并返回它们。然而返回类型是父类,但实际返回的对象是父类的子类。然后由用户将其返回的“父”对象转换为适当的子类。我认为这就是多态性,但我无法将返回的对象转换为子类。例如:

class Parent {...};

class ChildOne : public Parent {...};
class ChildTwo : public Parent {...};

Parent my_function(int x) {
    if(x) {
        return ChildOne();
    }
    else {
        return ChildTwo();
    }
};

int main() {
    // The statement below is giving me an error (no matching function call...)
    ChildOne my_child = (ChildOne)my_function(1);
}
4

2 回答 2

6

不,您不能将返回的对象my_function强制转换为Parent.

自从:

Parent my_function(int x) {

按值返回对象,它总是返回类的对象Parent,而不是子类。这是由于切片

有关讨论,请参阅什么是对象切片?

于 2013-08-10T16:36:44.547 回答
1

这是不可能的,因为它写在NPE 的答案中,

由于您在评论中询问了您可以做什么,这就是您可以在 C++11 中实现(或多或少)您想要的东西的方式。

#include <iostream>
#include <memory>
using namespace std;

class Parent { 
  public:
    virtual ~Parent() { }
};

class ChildOne : public Parent {
  public:
    void say_hello() { cout << "Hello from ChildOne!" << endl; }
};

class ChildTwo : public Parent { };

unique_ptr<Parent> my_function(int x) {

    if(x) {
        return unique_ptr<Parent>{ new ChildOne() };
    }
    else {
        return unique_ptr<Parent>{ new ChildTwo() };
    }
}

int main() {

    auto parent = my_function(1);

    if (ChildOne* my_child = dynamic_cast<ChildOne*>(parent.get())) {
        my_child->say_hello();
    }
}

但是,我会以不需要向下转换(从父级转换为子级)的方式修改我的代码。在某些情况下需要或不可避免,但大多数情况下这是设计缺陷的标志。

于 2013-08-10T21:13:33.883 回答