gpt4 book ai didi

c++ - 在 C++ 中干净地复制基类或子类的实例?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:42 24 4
gpt4 key购买 nike

在简单的示例继承层次结构中:

class Food
{
virtual ~Food();
};

class Fruit : public Food
{
virtual ~Fruit();
};

class Apple: public Fruit
{
virtual ~Apple();
}

class Vegetable: public Food
{
virtual ~Vegetable();
}

我希望创建一个可以从其子类或基类实例中克隆对象的方法:

Apple* apple1 = new Apple();
Apple* clone1 = apple1->clone();

Food* food1 = apple1;
Apple* clone2 = food1->clone();

我看到了一些可能的解决方案:

  • 使用多态性创建为每个子类显式定义的虚函数。

  • 使用模板化工厂方法获取类的实例和子类的类型来创建新实例。

  • 为存储在别处的每个类和子类注册一个 ID,以便在调用基类克隆函数时查找要创建的子类。

这些似乎都不理想,但我更倾向于第三种解决方案,因为它简化了克隆函数的调用,而不需要为每个子类(会有很多子类)编写定义。

但是,我非常愿意接受任何建议,是否有更好的方法来做到这一点?

最佳答案

您可以使用 CRTP 自动实现 Clone 方法。

template<typename T, typename Derive> class CloneImpl : public Derive {
public:
virtual Derive* clone() {
return new T(static_cast<const T&>(*this));
}
};
class Food {
public:
virtual Food* clone() = 0;
virtual ~Food() {}
};
class Fruit : public Food {
};
class Dairy : public Food {
};
class Apple : public CloneImpl<Apple, Fruit> {
};
class Banana : public CloneImpl<Banana, Fruit> {
};
class Cheese : public CloneImpl<Cheese, Dairy> {
};
class Milk : public CloneImpl<Milk, Dairy> {
};

在这种情况下,您始终可以调用 Clone() 来复制当前对象,并在堆上进行新的分配,而无需在任何类中再次实现它。当然,如果您的克隆语义需要不同,那么您只需更改函数即可。

CRTP 不仅可以为您实现 clone(),它甚至可以在不同的继承层次结构之间实现。

关于c++ - 在 C++ 中干净地复制基类或子类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4004138/

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