gpt4 book ai didi

c++ - 如何在 C++ 中创建一个允许多态返回不同类型的工厂方法?

转载 作者:行者123 更新时间:2023-11-30 01:52:13 25 4
gpt4 key购买 nike

我有一个基本类型:

class Foo{
public:
int height;
int weight;

void jump();

}

我有一个后代:

class Bar : public Foo{
//Has a different implementation of jump();
}

我有一个返回一种 Foo 的工厂;

static Foo createTheRightThing(int type){
if (type == 0){
return Foo();
}
else if (type ==1){
return Bar();
}
}

调用 createTheRightThing 的方法如下所示:

void boo {
Foo someFoo = FactoryClass::createTheRightThing(1); //Just using 1 to illustrate the problem.

}

问题:

someFoo 始终是 Foo,永远不会是 Bar,即使我传入 1 也是如此。当我传入 1 时,我可以看到正确的 else block 是输入,并且工厂确实返回了一个 Bar。成员变量,与创建 Bar 时工厂设置的变量相匹配。 如果我调用 someFoo.jump(),它总是 Foo 中的 jump()。它从不调用 Bar 中的 jump()

我做错了什么?我该如何解决?我了解 Java 和 Objective-c 中的多态性,但在 C++ 方面经验不多。这个问题是因为我没有创建新对象并返回指针吗?

最佳答案

通过从工厂函数按值返回对象,您是 slicing以便它们始终是工厂函数的返回类型,即 Foo。为了使多态性起作用,您需要返回一个指向您创建的对象的指针(引用也可以,但在这种情况下指针更合适)。您应该将工厂功能更改为

static std::unique_ptr<Foo> createTheRightThing(int type){
if (type == 0){
return std::unique_ptr<Foo>(new Foo());
}
else if (type ==1){
return std::unique_ptr<Foo>(new Bar());
}

// and maybe add this, or throw an exception
return std::unique_ptr<Foo>();
}

为了使其正常工作,您还需要进行以下更改 - Foo::jump 应该是 virtual 的析构函数也应该是富

class Foo{
public:
int height;
int weight;

virtual void jump();
virtual ~Foo() = default;
};

关于c++ - 如何在 C++ 中创建一个允许多态返回不同类型的工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24989234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com