2017-10-19 78 views
1

我有一段cpp的階級是這樣的值:C++重寫繼承的靜態常量

class A{ 
    protected: 
     static const int _a = 0, _b = 0, _c = 0; 
     std::string _data; 
    public: 
     void myMethod(); //method that changes _data based on the value of _a, _b and _c 
}; 

如果我想創建讓我們說:

Class B : public A{}; 

如何更改的_a值,_b_c爲了改變myMethod的行爲?即使我再次聲明它們,myMethod仍將使用值class A而不是class B

如果我想更改這3個數字,是否需要覆蓋整個myMethod函數?

編輯:myMethod()public,而不是private

+0

如果您明確調用B :: myMethod(),行爲是否會改變? – xyious

+1

這些值是常量,因此它們不能更改。 –

+1

你不能改變它們,因爲它們是'const'。因此 - 它們只能被初始化。 –

回答

0

您不能直接更改const靜態成員,但可能您想要的是virtualgetA(), getB(), getC()方法。

然後你的A::myMethod()實現使用getters而不是直接訪問靜態成員。

在你B類,則可以覆蓋get方法返回不同的值(可能來自新申報靜讀或任何有意義的),然後A::myMethod()會自動接他們回家。

0

由於名稱的狀態爲const,因此無法更改常量的值。你只能初始化它們。

class A{ 
    protected: 
     static const int val1, val2, val3; 
    public: 
     void myMethod(); 
}; 

const int A::val1 = 9; 
const int A::val2 = 5; 
const int A::val3 = 4;