2013-04-25 121 views
0

我正在學習使用C++的OOP,並遇到了我不太明白的情況。C++繼承和成員訪問問題

{瞭解公共數據成員的貧窮實踐和假設指針不是NULL}:

... 

class Foo { 
    public: int a = 0; 
} 

class Bar: public Foo { 
    public: int a = 1; 
} 

void display (Foo * in) { 
    if(in->a) 
     cout << "I'M A BAR" << endl; 
    else 
     cout << "I'M A FOO" << endl; 
} 

int main() { 
    Foo * BAR = new Bar; 
    display(BAR); //Displays "I'M A FOO" 
    return 0; 
} 

,多一點修修補補我發現,如果我改用構造函數來設置非const int的一個值後, 0和1,並且還輸出構造函數的值,我發現該值實際上在BAR中被設置爲1,但在顯示函數內被評估爲0。

如果這沒有意義,我很抱歉,我懷疑自己真正理解的問題是否正確,但我想知道爲什麼BAR不會像顯示內部的Bar一樣對待,以及如何讓它這樣做(如果可能,仍然使用基類指針作爲參數)。

回答

4

你的代碼有意義,但它可能不是你的想法。

Bar類有成員稱爲a,一個是Bar::a,一個是Bar::Foo::a,所述Foo基類的成員。

當您訪問無論是Foo或通過指針Bar對象,像p->a,那麼你總是得到Foo基子對象的a成員。

換句話說,你不能「覆蓋」數據成員。

你暗示只有其他代碼有一個數據成員,它應該是這樣的:

struct Foo 
{ 
    int a; 
    Foo() : a(0) { } 
protected: 
    explicit Foo(int n) : a(n) { } 
}; 

struct Bar : Foo 
{ 
    Bar() : Foo(1) { } 
}; 

注意如何FooBar只有一個單一的數據成員a在此設置。

+2

這正是我想要做的,非常感謝你! – Flexo1515 2013-04-25 22:41:12

+0

@ user1404053:很酷。但是,不要以真實的代碼來做這件事,而應該使用虛擬功能。 :-) – 2013-04-25 22:42:12