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

Joh*_*rer 4 c++ polymorphism virtual

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

A* clone(){
    return new A(*this);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我发现这个不必要的样板代码,因为如果想要使用C++的运行时多态特性,这几乎总是需要的.怎么能被规避呢?

谢谢

为什么我需要这个:

我的用例可以抽象为以下示例:我有一个class Integral,它评估一些函数的积分.这样做,他们有一个指向该成员的成员class MathFunction.这个抽象类包含一个带有evaluate一个参数的纯虚函数.我想实现我会创建的电源功能class PowFunction : class MathFunction.这个类有一个成员exponent,函数evaluate看起来像这样:

double evaluate(x){
    return pow(x,exponent);
}
Run Code Online (Sandbox Code Playgroud)

如所陈述的部件MathFunctionclass Integral必须是polymorhpic,这就要求它是一个指针.用另一个问题回答评论者的问题.为什么我不想复制MathFunction对象?

我真的希望Integral"拥有"它的MathFunction,这意味着它可以在exponent不改变任何其他Integral对象的MathFunction的情况下改变参数(例如).这意味着每个Integral都需要拥有自己的副本.这需要一个用于MathFunctions的clone()函数,不是吗?

我想到的另一种选择:如果几个Integral对象可以通过指向同一地址的指针共享相同的MathFunction,我可以创建Integral对象的副本而无需复制MathFunction.但在这种情况下,我必须使所有的属性const或某种方式readonly,这也不是很优雅.另外,哪个Integral对象应该处理删除MathFunction对象?

为什么你需要这个:

您是否认真地说,只要您使用多态对象,就不需要复制操作?是什么让多态对象在这方面与其他对象不同?

使用此论证,您还可以将复制构造函数和复制赋值运算符从C++标准中删除!

Pup*_*ppy 9

减少克隆多态对象的需要.真的,我很少在我自己的代码中找到这个需求,并且对这个问题的评论表明我并不孤单,如果你发现自己克隆了一切,你可能设计错了.

当然,永远不要无益,你确实可以使用奇怪的重复模板模式.

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