在C++中实现复杂的继承

Pet*_*mit 3 c++ inheritance

我有以下现有课程:

class Gaussian {
public:
  virtual Vector get_mean() = 0;
  virtual Matrix get_covariance() = 0;
  virtual double calculate_likelihood(Vector &data) = 0;
};

class Diagonal_Gaussian : public Gaussian {
public:
  virtual Vector get_mean();
  virtual Matrix get_covariance();
  virtual double calculate_likelihood(Vector &data);
private:
  Vector m_mean;
  Vector m_covariance;
};

class FullCov_Gaussian : public Gaussian {
public:
  virtual Vector get_mean();
  virtual Matrix get_covariance();
  virtual double calculate_likelihood(Vector &data);
private:
  Vector m_mean;
  Matrix m_covariance;
};
Run Code Online (Sandbox Code Playgroud)

如您所见,Gaussian类充当接口但没有任何实现.这一切都很好.

现在我想创建一个类"AdaptedGaussian",其中在计算似然性之前,将改变提供给calculated_likelihood的数据向量.

一些要求:

  • AdaptedGaussian必须是高斯的子类
  • AdaptedGaussian必须能够"包装"或"成为"每个可能的高斯类的实例
  • AdaptedGaussian必须由已经存在的高斯对象构造

我现在的想法是:

class Adapted_Gaussian : public Gaussian {
private:
  Gaussian* m_g;

public:
  virtual Vector get_mean() { return m_g->get_mean(); }
  virtual Matrix get_covariance() { return m_g->get_covariance(); }
  virtual double calculate_likelihood(Vector &data) 
  { 
    //do something with data
    return g->calculate_likelihood(Vector &data); 
  }
} 
Run Code Online (Sandbox Code Playgroud)

可能有一些缺点:

  • 对于每个方法(并且这里显示的不仅仅是),必须在新类中编写一个虚方法
  • 如果Gaussian被扩展,并且这个类将被遗忘,那么就会出现令人讨厌的错误.

我是以正确的方式做到这一点的吗?或者有更好的方法来实现这个?

是否有一种很好的方法可以将每个未实现的方法标准委托给m_g的相同命名方法?

osc*_*kuo 5

看起来不错,我认为这是适配器模式的一个非常经典的实现.只是不要忘记为高斯类声明一个虚拟析构函数.至于缺点.

  1. Java类库处理虚方法问题的方法是创建一个为每个方法提供空实现的虚拟类.所有不想实现每个方法的类都可以从这个虚拟类继承并有选择地覆盖它们感兴趣的方法.
  2. 如果使用更多方法扩展Gaussian类,只要将它们声明为纯虚方法,无论如何都会在子类文件中出现编译器错误.