2017-07-18 49 views
0

快速問題:我有一個基類與成員變量,我試圖'重寫'派生類中的這個值。我該如何做到這一點?'重寫'類成員

我嘗試:

class A 
{ 
public: 
    double i = 1; 
}; 

class B : public A 
{ 
public: 
    double i = 2; 
}; 


int main(int argc, char** argv) 
{ 
    B* b = new B(); 
    A* a = b; 
    std::cout << b->i << '\t' << a->i << std::endl; // output 2 1 
} 

但是所期望的輸出是 '2 2'。 我在做什麼錯?

感謝,

尼克拉斯

+0

使用虛擬功能。 – Quentin

+4

您可以覆蓋虛擬功能,而不是數據成員。 – interjay

+1

爲什麼不在'B'的構造函數中爲'i'分配一個新值? – UnholySheep

回答

1

您可以覆蓋虛擬功能;您無法覆蓋數據成員。該班級有兩個不同的成員i,其中一個在A類中,另一個在B中。

如果您希望派生類更改基類中的i的值,只需在構造函數中執行:B() { i = 2; }。但更好的方法是有A一個構造函數設置的i的價值,並呼籲從B

A::A(int ii = 1) : i(ii) {} 
B::B() : A(2) {} 
0

甚至有比皮特提出了simplier的解決方案。

只要定義您的B類是這樣的:

class B : public A 
{ 
public: 
    B() { i = 2; } 
} 

使B類將重用我在其底部(A)和它的默認值定義的構件將被「重寫」到2,從而測試代碼將返回「2 2」。

這就是你如何1)不改變基類A(不要添加不必要的int參數與默認值,有些人甚至說,具有默認值的函數參數是一個不錯的做法在c + +)和2 )不要爲類添加虛擬函數的開銷(在簡單代碼中這也是不必要的)。

+0

如果我在類A中說const double i,這似乎不可行。有沒有辦法解決它? –

+0

不,const是一個不同的東西,const只能在構造函數(A)中初始化,所以在這種情況下,你需要使用Pete的解決方案。 – some