要求派生类提供静态常量值

问题描述 投票:0回答:1

我有一个基类和派生类。基类使用纯虚方法要求派生类实现方法 - 否则无法编译。经典。

我是否还可以要求基类派生类为常量提供一个值?它必须是一个编译时常量,但如果它们没有给出常量的值,它也必须是一个编译错误。它对于每个派生类来说也是静态的,因为它是独立于实例的。

我看到的答案建议编写一个返回值的纯虚拟 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
这样的东西,但是值会有所不同,不取决于作为实例的对象,而仅仅取决于对象的类。

c++ inheritance pure-virtual compile-time-constant
1个回答
0
投票

在这些限制下,你不能比虚拟 getter 做得更好(这意味着 运行时):

struct Base {
          enum { idN = 0; };
          virtual int id() { return idN; }
};

struct Derived : Base {
          enum { derivedN = Base::idN + 1; };
          int id() override { return derivedN; }
};

如果这意味着仅在基类实现内部使用,那么这个想法本身就是有缺陷的设计的标志 - 某些东西正在成为那里的“神类”。

© www.soinside.com 2019 - 2024. All rights reserved.