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)
如所陈述的部件MathFunction的class Integral必须是polymorhpic,这就要求它是一个指针.用另一个问题回答评论者的问题.为什么我不想复制MathFunction对象?
我真的希望Integral"拥有"它的MathFunction,这意味着它可以在exponent不改变任何其他Integral对象的MathFunction的情况下改变参数(例如).这意味着每个Integral都需要拥有自己的副本.这需要一个用于MathFunctions的clone()函数,不是吗?
我想到的另一种选择:如果几个Integral对象可以通过指向同一地址的指针共享相同的MathFunction,我可以创建Integral对象的副本而无需复制MathFunction.但在这种情况下,我必须使所有的属性const或某种方式readonly,这也不是很优雅.另外,哪个Integral对象应该处理删除MathFunction对象?
为什么你需要这个:
您是否认真地说,只要您使用多态对象,就不需要复制操作?是什么让多态对象在这方面与其他对象不同?
使用此论证,您还可以将复制构造函数和复制赋值运算符从C++标准中删除!
减少克隆多态对象的需要.真的,我很少在我自己的代码中找到这个需求,并且对这个问题的评论表明我并不孤单,如果你发现自己克隆了一切,你可能设计错了.
当然,永远不要无益,你确实可以使用奇怪的重复模板模式.
template<typename T> struct Clone {
virtual T* clone() { return new T(static_cast<const T&>(*this)); }
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1493 次 |
| 最近记录: |