C ++确保子类为常量提供自定义值

时间:2018-10-07 20:09:49

标签: c++ inheritance

假设我们有一个抽象STYLESHEET = '''QTreeWidget {border:None} QTreeWidget::Item {height: 80px; border-bottom:2px solid black; color: rgba(255,255,255,255);} /* +++ */ QTreeView { alternate-background-color: rgba(170,170,170,255); background: rgba(211,211,211,255);}''' self.treeWidget = QTreeWidget() self.treeWidget.setAlternatingRowColors(True) self.treeWidget.setStyleSheet(STYLESHEET) ,它具有多个子类。每个具体的类(不是对象)都有一个与之关联的优先级。存储此优先级的一种方法就是简单地作为class A中的protected int prio

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

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

3 个答案:

答案 0 :(得分:2)

我没有找到一种方法来确保在子容器中初始化非静态数据成员。维护具有相同含义的不同静态数据成员也很棘手,而且容易出错。因此,我建议使用一个纯虚函数动态获取子类的优先级。纯虚拟确保子类必须重写此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;
}

答案 1 :(得分:0)

最简单的方法是使用经典替代。相同类别的优先级始终相等。

sbt shell

答案 2 :(得分:0)

  

存储此优先级的一种方法就是将其存储为protected int prio中的A

那是行不通的。

如果您使用

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>
{
    ...
};