c++ - 具有非虚拟接口(interface)和一些私有(private)变量的克隆方法

标签 c++ clone virtual member non-virtual-interface

我有一个抽象类Figure和一些派生类:CircleSquare、...

类图实现:

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/

相关文章:

grails - 域类复制 Grails 域实例的 clone() 的正确实现

c++ - 简单程序中的虚拟析构函数导致编译器错误 : "unresolved external symbol"

c++ - 海湾合作委员会 : C++11 inline object initialization (using "this") does not work when there is a virtual inheritance in hierarchy

c++ - 在二维数组中查找最大的 2x2 平均值

c++ - 为什么断言宏仅用于调试构建

android - Cocos2d-x - Android - 某些图像在具有相同分辨率的某些设备上不显示

c# - memberwiseclone 还会复制派生类中定义的成员吗?

c++ - 我如何知道在 HTML 中嵌入 ActiveX 控件时是否会收到 HWND?

git - 克隆密码中带有斜线的存储库

c++ - 强制虚拟方法表中的函数顺序?