c++ - 是否可以在 C++ 类中声明一个虚拟静态常量值?

标签 c++ inheritance virtual constants static-members

我想要一个具有常量字段的基类(例如与类关联的唯一 ID,在编译后无法修改)。到目前为止static const声明就好了。现在,我想继承这个基类,并确保这个类的子类确实有相同的字段,但有自己的值。我该怎么做?

假设,我想要一个名为 Base 的基类与 ID包含 int 的字段值 0。然后,我想要类 A , BC ,他们都是 Base 的公共(public)子代我想确保这些 child 也有 ID具有各自值 1、2 和 3 的字段(通过“确保”,我的意思是如果它们没有显式声明的 ID,则会出现编译器错误)。

如果我能设法构建这个场景,我的期望是要求 ID Base* 的字段指针,我应该得到不同的值,具体取决于指针是否创建为 new A() , new B()new C() .

我的猜测是声明 ID作为 virtual static const ,这当然没有意义,并且会产生编译器错误。

但是我该怎么做才能达到所描述的结果呢? (我唯一能想到的是将 ID 声明为返回整数的虚函数,然后将值硬编码到函数体中,但我正在寻找更优雅的东西。)

提前谢谢你!

最佳答案

static方法不能是virtual,任何数据成员都不能是virtual

但你可以隐藏派生类中的static字段,并使用virtual方法返回它们。

class A
{
public:
    static const int ID = 0;
    virtual int getID() { return A::ID; }
};
class B : A
{
public:
    static const int ID = 1;
    virtual int getID() { return B::ID; }
};

替代方案:

class A
{
public:
    A(int id = 0) : ID(id) {}
    const int ID;
    getID() { return ID; }
};
class B : public A
{
public:
    B() : A(1) {}
};

关于c++ - 是否可以在 C++ 类中声明一个虚拟静态常量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915568/

相关文章:

C++指针算术怪异

C++ 自定义数组容器动态大小

c++ - 具有相同签名的模板不会导致编译器错误

C++ - 在初始化类成员之前运行一个函数

c++ - 如何在 C++ 中创建多态和可加的 init() 函数?

Objective-C 检测类是否覆盖了继承的方法

inheritance - Swift 协议(protocol)继承和泛型函数

c++ - 模拟虚方法的构造函数行为

c++ - 如果在子类中将虚方法声明为 virtual 是否有任何区别?

c++ - 对象的销毁是否正确发生?