c++ - 如何避免 c++ 中多态对象的 clone() 样板代码

标签 c++ polymorphism virtual

如果我想在 C++ 中克隆一个多态对象(即从其他类 B 派生的类 A 的实例),最简单的方法似乎是给 B 一个虚拟克隆成员函数,它必须被覆盖A 看起来像这样

A* clone(){
    return new A(*this);
}

我的问题是,我发现这种不必要的样板代码,因为如果想使用 C++ 的运行时多态特性,这几乎总是需要的。如何规避?

谢谢

为什么我需要这个:

我的用例可以抽象为以下示例: 我有一个 class Integral,它计算某个函数的积分。这样做,他们有一个成员,它是指向 class MathFunction 的指针。这个抽象类包含一个纯虚函数evaluate,它接受一个参数。我想实现幂函数,我将创建一个 class PowFunction : class MathFunction。此类将有一个成员 exponent,函数 evaluate 如下所示:

double evaluate(x){
    return pow(x,exponent);
}

如前所述,class Integral 的成员 MathFunction 必须是多态的,这要求它是一个指针。用另一个问题回答评论者的问题。为什么我不想制作 MathFunction 对象的拷贝?

我真的希望 Integral “拥有”它的 MathFunction,这意味着它可以更改参数(如 exponent)而不更改任何其他 Integral 对象的 MathFunction。这意味着每个 Integral 都需要有自己的拷贝。这需要 MathFunctions 的 clone() 函数,不是吗?

我想到的一个替代方案是:如果多个 Integral 对象可以通过指向相同地址的指针共享相同的 MathFunction,我可以创建 Integral 对象的拷贝而无需复制 MathFunction。但在这种情况下,我必须将所有属性设置为 const 或以某种方式设置为只读,这也不是很优雅。另外,哪个 Integral 对象应该处理删除 MathFunction 对象?

为什么需要这个:

您是认真的说,一旦您使用多态对象,您就不再需要复制操作了吗?是什么让多态对象在这方面与其他对象不同?

使用这个论证,您还可以将复制构造函数和复制赋值运算符抛出 C++ 标准!

最佳答案

减少克隆多态对象的需要。真的,我很少在我自己的代码中发现需要这样做,而且对这个问题的评论表明,我并不是唯一一个认为如果你发现自己克隆所有东西的人,你可能设计错了。

当然,永远不要无益,您确实可以使用 Curiously Recurring Template Pattern。

template<typename T> struct Clone {
    virtual T* clone() { return new T(static_cast<const T&>(*this)); }
};

关于c++ - 如何避免 c++ 中多态对象的 clone() 样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283272/

相关文章:

c++ - 何时在空实例上调用成员函数会导致未定义的行为?

c++ - 在外部 iOS 项目中使用 Box2D/Cocos2D

c++ - 使用 boost 创建一个始终返回 true 的 lambda 函数

polymorphism - 在 Rust 匹配表达式中保持 DRY

c# - 从 derived 而不是 base 调用的虚拟方法

c++ - 在派生类中使用来自虚拟基类的 protected 构造函数

c++ - std::vector 中没有名为 iterator_category 的类型

C++ 在派生类和基类中使用同名的两个变量

c++ - 如何使用多态参数动态调用函数

android - 目标 google API 和目标 android 之间的区别