【问题标题】:C++ Ensure that subclasses provide a custom value for a constantC++ 确保子类为常量提供自定义值
【发布时间】:2018-10-07 20:09:48
【问题描述】:

假设我们有一个抽象class A,它有多个子类。每个具体类(不是对象)都有一个与之关联的优先级。存储此优先级的一种方法是在A 中简单地使用protected int prio

但是如何确保每个子类确实为prio 设置了一个值?

我能想到的唯一方法是使用模板化并将优先级作为类型的一部分。我希望有一种更轻量级的方法。

【问题讨论】:

  • 你想的是非静态成员prio还是静态成员?
  • 类 A 应该有一个带 int 参数 (prio) 的受保护构造函数。
  • @Richard Critten 但是如何确保类的每个对象的 prio 是恒定的?
  • @Stephan Lechner 无论哪种方式都可以,静态可能更合适
  • 这听起来像是XY problem

标签: c++ inheritance


【解决方案1】:

我没有看到一种方法可以确保在子类中初始化非静态数据成员。维护具有相同含义的不同静态数据成员也很棘手且容易出错。所以我建议使用纯虚函数来动态获得子类的优先级。纯虚拟确保子类必须覆盖此 getter:

class Base {
public:
    void print() const { std::cout << "prio: " << getPrio() << std::endl; }
protected:
    virtual int getPrio() const = 0;
};

class Sub1 : public Base {
    int getPrio() const override { return 1; }
};

class Sub2 : public Base {
    int getPrio() const override { return 2; }
};

int main()
{
    Sub1 s1;
    Sub2 s2;
    s1.print();
    s2.print();
    return 0;
}

【讨论】:

    【解决方案2】:

    存储此优先级的一种方法是在A 中简单地作为protected int prio

    那是行不通的。

    如果你使用

    static int prio;
    

    A 及其所有子类只有一个变量。

    如果你使用

    int prio;
    

    每个实例都将其作为成员变量,违背了为每个类创建值的目的。

    您可以使用以下策略来最小化样板代码。

    class A { ... };
    
    template <typename T>
    struct PriorityHolder
    {
       static int prio;
    };
    
    template <typename T> 
    int PriorityHolder<T>::prio = <Find a suitable method for value>;
    
    class Derived1 : public A,
                     public PriorityHolder<Derived1>
    {
        ...
    };
    

    【讨论】:

      【解决方案3】:

      最简单的方法是使用经典覆盖。相同类的优先级总是相等的。

      class A {
      public:
        virtual int get_priority()=0;
      };
      
      
      class B : A {
      public:
        int get_priority() {
           return 2;
        }
      };
      
      class C : A {
      public:
        int get_priority() {
          return 3;
        }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 2012-01-13
        相关资源
        最近更新 更多