ABC中的多态静态const成员变量?

时间:2011-09-26 09:56:27

标签: c++ static polymorphism const

我有一个相当奇怪的情况,我希望能够定义ABC的子类可以覆盖的某些常量。

struct A {
    static const int a = 20;
    virtual int func() = 0;
};
struct B : public A {
    static const int a = 3;
    int func() { return 5; }
};
struct C : public A {
    static const int a = 4;
    int func() { return 3; }
};

不幸的是,如果我使用A *aPtr = new BaPtr->a将返回20而不是3。

我看到的一个解决方法是单线函数(在上面的例子中沿着func的行),但是常量的语法在概念上更适合这种特殊情况。是否有一种语法上合理的方法来解析在运行时使用哪些常量,其中调用代码在初始对象创建后不需要知道任何内容?

2 个答案:

答案 0 :(得分:8)

常量,尤其是静态常量,不能像你要求的那样被覆盖。您将不得不使用虚拟功能:

struct A {
    virtual int get_a() { return 20; }
    int func() = 0;
};

struct B : public A {
    virtual int get_a() { return 3; }
    int func() { return 5; }
};

struct C : public A {
    virtual int get_a() { return 4; }
    int func() { return 3; }
};

另一种选择是使用常量模板:

template< const int a_value = 20 >
struct A {
    static const int a = a_value;
    int func() = 0;
};

struct B : public A<3> {
    int func() { return 5; }
};

struct C : public A<4> {
    int func() { return 3; }
};

答案 1 :(得分:1)

您可以从示例本身获得答案! :)只需声明get_a()之类的virtual方法,并覆盖相同的方法。

struct A {
    static const int a = 20;
    virtual int get_a() const { return a; }  // <--- for A
};
struct B : public A {
    static const int a = 3;
    virtual int get_a() const { return a; }    // <--- for B
};
struct C : public A {
    static const int a = 4;
    virtual int get_a() const { return a; }    // <--- for C
};

另请注意,只有方法可以在C ++中重写,而不是变量。