我有一个基类和派生类。基类使用纯虚方法要求派生类实现方法 - 否则无法编译。经典。
我是否还可以要求基类派生类为常量提供一个值?它必须是一个编译时常量,但如果它们没有给出常量的值,它也必须是一个编译错误。它对于每个派生类来说也是静态的,因为它是独立于实例的。
我看到的答案建议编写一个返回值的纯虚拟 getter,但是 getter 可以具有动态代码,其行为取决于某些条件。我的意思是,这将是终生不变的。此外,由于它在该解决方案中不是静态的,因此派生类的每个实例可能都有一个该常量值的实例,这会浪费内存。
基本上就像一个名字或ID。这是它的样子,但当然,由于多种原因,它无法编译。
class Base
{
Base();
~Base();
virtual void doSomething() = 0;
/* Unknown for Base, meant as an abstract / pure virtual class,
but required for all derived classes. */
static const int id;
}
class VariantA : public Base
{
VariantA();
~VariantA();
static const int id = 215684;
void doSomething() {...}
SomeType someData;
};
class VariantB : public Base
{
VariantB();
~VariantB();
static const int id = 6451322;
void doSomething() {... /* do it differently than VariantA */}
SomeOtherType someOtherData;
};
id
永远不会改变,也不依赖于实例,但确实依赖于我们在任何给定时刻处理的派生类。简单地拥有一个继承自 Base
的类的对象就可以保证我们拥有像 id
这样的东西,但是值会有所不同,不取决于作为实例的对象,而仅仅取决于对象的类。
在这些限制下,你不能比虚拟 getter 做得更好(这意味着 运行时):
struct Base {
enum { idN = 0; };
virtual int id() { return idN; }
};
struct Derived : Base {
enum { derivedN = Base::idN + 1; };
int id() override { return derivedN; }
};
如果这意味着仅在基类实现内部使用,那么这个想法本身就是有缺陷的设计的标志 - 某些东西正在成为那里的“神类”。