C++中有两个非常相似的类,只有一种不同的方法:如何实现?

Iva*_*van 3 c++ virtual templates function

除了一种方法,我有两个几乎相同的类.这些类具有相同的数据部分和所有成员函数,但只有一个:

class A {
private:
  double data;
public:
  double calc(){
     return data*data;
  }
   double especific(){
     return 2.0*data;
  }
 }
Run Code Online (Sandbox Code Playgroud)

除了特定方法之外,第二类是相同的.

这个成员函数特别需要计算所有成员数据,因此不能选择传递值或引用.有没有办法在没有大量代码重复的情况下实现它?要么只使用一个类,要么使用模板,而不是继承(巨大的性能影响).

谢谢

编辑:感谢所有的回复.策略模式可以帮助我的情况,我会尝试它,看看它是否有效.基于我在不同程序中进行的一些测试,我正在避免虚拟继承作为瘟疫.这个例程将随处调用,性能是一个非常重要的因素.

Omn*_*ous 9

这听起来像是战略模式的工作.在这种情况下,它可以作为模板参数实现.通常它会在类上实现为构造函数参数或setter方法,但这需要继承才能正常工作.

在这种情况下,像:

template <class SpecificStrategy>
class A {
 private:
    double data;
 public:
    double calc(){
       return data*data;
    }
    double especific() {
       return SpecificStrategy::especific(data);
    }
};

class DoubleStrategy {
   static double especific(double data) {
      return 2 * data;
   }
};
class TripleStrategy {
   static double especific(double data) {
      return 3 * data;
   }
};
Run Code Online (Sandbox Code Playgroud)

然后你可以参考:

A<DoubleStrategy> x;
A<TripleStrategy> y;
Run Code Online (Sandbox Code Playgroud)

x并且y将是完全不相关的类型,但听起来这不是你想要的在这种情况下.

现在,在我看来,使用虚函数和继承是要走的路.正如其他人所指出的那样,性能损失并不是那么大.但是在某些情况下,我可以看到这是一个坏主意.

例如,如果此类旨在表示图形包中的向量,并且您将对数百万个进行相同的转换,那么我可以看到您不希望虚函数调用成为其中的一部分执行转换的代码.事实上,你可能希望避免使用任何类型的指针解引用来帮助它.

  • 好答案; 作为一个附注,我经常会因为人们将这种或那种技术标记为"模式"而感到轻笑.模式被认为是人的发明,还是被认为是人们的观察?因为你所谓的"战略模式",我称之为"功能编程". (4认同)