两个只在静态const成员中不同的子类

时间:2016-10-08 20:06:20

标签: c++ inheritance

我有一个班级A和两个孩子BC如下:

class A {
   private:
     int x;
     template<class T>
     void setX(T &y);

   public:
     A();
};
class B : public A {
  private: 
    static const double y;

  public: 
      B();
};
class C : public A {
  private: 
    static const int y;

  public: 
      C();
 };

两个孩子的静态成员y的类型不同。除静态成员的初始化外,C和B的实现是相同的:

B::B() : y (1.2) { setX(y) } 
C::C() : y (2) { setX(y) } 

但这种方法的问题在于,在实现文件中,我必须为BC编写两次相同的代码。有没有一种正确的方法来写这个,这样我就不需要写两次setX的调用了?

在真正的问题中,课程有点复杂,但手头的情况是一样的。特别是,y的初始化需要非平凡的构造函数,因此必须在实现文件中。

1 个答案:

答案 0 :(得分:1)

您可以为A编写一个构造函数作为函数模板。

class A {
    //....
public: 
    template<typename T>
    explicit A(T& y) {
        setX(y);
    }
};

从子类中调用该构造函数:

class B : public A{
    //...
public:
    B() : A(1.2), y(1.2)
    {}
};

唯一的问题是首先调用基类构造函数,因此需要重复两次常量数据值。你可以轻松地将其设为宏。