2011-09-26 37 views
3

我有一个奇怪的情况,我希望能够定义ABC的一个子类可以覆盖的某些常量。ABC中的多态静态const成员变量?

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在上面示例中的行),但常量的语法在概念上更适合于这种特殊情况。是否有一种解析在运行时使用哪些常量的语法合理方式,其中调用代码在初始对象创建后不需要知道任何东西?

+0

可能重复[覆盖静态变量时子类化](http://stackoverflow.com/questions/594730/overriding-static-variables-when-subclassing) –

+1

想要这样做的原因可能是有缺陷的:一个常量应该很好,*常数*。它有时并不是恒定的,有时候还是别的。同样,静态成员是类的属性,而不是实例,所以它们在继承中不起作用,这是基于* instance *的概念。 –

回答

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; } 
}; 
+5

对于模板版本,应该注意类'B'和'C'现在完全不相关,因为它们具有不同的基类。 –

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++和不变量被重写。