我有一个抽象类Figure
和一些派生类:Circle
、Square
、...
类图实现:
private:
virtual double varea()=0;
double multiplier;
public:
virtual Figure * clone()=0;
double area() { return varea()*multiplier; }
数字(例如 Square)的行为如下:
private:
double L;
public:
virtual Figure * clone() {return new Square(*this);}
virtual double varea() {return L*L;}
在调用克隆方法时,我很难分配变量乘数。实现这一目标的最佳方法是什么?当然,这只是一个愚蠢的例子,有很多解决方法,但实际上,通过多个层次的推导,它们并不那么明显,所以请坚持这种模式。
我是否应该为方法克隆也选择一个虚拟接口(interface)?这样我就可以直接在Figure类中分配乘数,而不需要让每个图形知道它的乘数。
最佳答案
除非您为类Figure 声明一个复制构造函数,否则该语言会为您提供一个免费,而且它是公共(public)的。您不需要这个免费的公共(public)复制构造函数。它将导致切片。将类Figure 的复制构造函数设置为 protected 。非抽象派生类的复制构造函数应调用此 protected 复制构造函数。有了这个,clone成员函数就像new DerivedClass(*this)
一样简单:
class Figure {
private:
virtual double varea()=0;
double multiplier;
protected:
Figure () : multiplier(1.0) {}
Figure (const Figure& src) : multiplier(src.multiplier) {}
public:
virtual Figure* clone()=0;
double area() { return varea()*multiplier; }
};
class Square: public Figure {
private:
virtual double varea() {return L*L;}
double L;
public:
Square(const Square & src) : Figure(src), L(src.L) {}
virtual Figure* clone() {return new Square(*this);}
};
请注意:
- 我将
Square::varea()
设为私有(private),因为这就是它在类Figure
中的声明方式。在派生类中将父类的私有(private)方法公开为公共(public)方法通常有点可疑。 - 赋值运算符存在问题。我会把这件事留给你。
- 您需要某种方法来设置
乘数
。
关于c++ - 具有非虚拟接口(interface)和一些私有(private)变量的克隆方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20654004/