C++ C++;确保子类为常量提供自定义值
假设我们有一个抽象的C++ C++;确保子类为常量提供自定义值,c++,inheritance,C++,Inheritance,假设我们有一个抽象的类A,它有多个子类。每个具体类(不是对象)都有与其关联的优先级。存储此优先级的一种方法是在a中作为protected int prio 但是如何确保每个子类确实为prio设置一个值呢 我能想到的唯一方法是使用模板化并使类型具有优先级。我希望有一个更轻量级的方法 最简单的方法是使用经典覆盖。同一类的优先级总是相等的 class A { public: virtual int get_priority()=0; }; class B : A { public: int
类A
,它有多个子类。每个具体类(不是对象)都有与其关联的优先级。存储此优先级的一种方法是在a
中作为protected int prio
但是如何确保每个子类确实为prio
设置一个值呢
我能想到的唯一方法是使用模板化并使类型具有优先级。我希望有一个更轻量级的方法 最简单的方法是使用经典覆盖。同一类的优先级总是相等的
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;
}
};
存储此优先级的一种方法是在a
中作为protected int prio
那是行不通的
如果你使用
static int prio;
int prio;
A
及其所有子类只有一个变量
如果你使用
static int prio;
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>
{
...
};
A类{…};
模板
结构优先持有人
{
静态int-prio;
};
模板
int PriorityHolder::prio=;
类别1:公共A,
公共优先权持有人
{
...
};
我看不到一种方法可以确保在子容器中初始化非静态数据成员。维护具有相同含义的不同静态数据成员也很棘手,而且容易出错。因此,我建议使用纯虚函数来动态获取子类的优先级。Pure virtual确保子类必须重写此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;
}
类基{
公众:
void print()const{std::cout您考虑的是非静态成员prio
还是静态成员?类a应该有一个接受int参数(prio)的受保护构造函数.@Richard Criten但如何确保类的每个对象的prio都是常量?@Stephan Lechner无论哪种方式都可以,静态可能更合适这听起来像是一个。