2011-09-26 87 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++和不變量被重寫。