c++ - 仅静态常量成员不同的两个子类

标签 c++ inheritance

我有一个类(class) A 和两个 child 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();
 };

两个 child 的区别仅在于它们的静态成员 y 的类型。除了静态成员的初始化之外,C 和 B 的实现是相同的:

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

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

在实际问题中,类稍微复杂一些,但手头的情况是一样的。特别是,y 的初始化需要非平凡的构造函数,因此它必须在实现文件中。

最佳答案

您可以为 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)
    {}
};

唯一的问题是基类构造函数首先被调用,因此您需要重复常量数据值两次。不过,您可以轻松地对其进行宏设置。

关于c++ - 仅静态常量成员不同的两个子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39936850/

相关文章:

c++ - 在 iPhone 上运行 C++ 有什么限制?

使用 Sequelize 继承 ExpressJS

c# - 继承与类型标志

C++ : How to bind inherited methods only to parent classes?

c++ - operator+ 的模糊重载

c++ - 模板和#defines 的奇怪行为

java - 当子类在本地重写其中一些方法时,如何强制子类使用父方法?

c# - 如何将多态引入实体数据模型

c++ - 从父类调用继承函数

c++ - 您可以在哪些类型的输入流上调用 seekg?