2010-05-05 42 views

回答

1

它正是它應該做的。派生的陰影基地。

+1

函數可以被重載和覆蓋。會員不能。 「Derived :: m_pants」和「Base :: m_pants」完全是兩個不同的變量。如果你在一個小測試程序中使用'std :: cout << sizeof(Base)<<''<< sizeof(Derived)<< std :: endl;',你會發現'Derived'的大小大於'Base'。你甚至可以使變量使用相同的名稱和類型,但它們仍然是不同的變量,因爲它們屬於不同的類。 – Dustin 2010-05-05 01:12:24

+1

啊,你把你使用的術語從「覆蓋」改爲「陰影」,從而使我的評論無效。感謝您修復它。 :) – Dustin 2010-05-05 01:18:38

+0

@Dustin,謝謝你提高我的術語。 – 2010-05-05 01:21:14

7

它沒有被標記爲錯誤,因爲它不是錯誤。沒有什麼說你不能在派生類中擁有與基類中的成員相同的成員。

如果你有Derived類型的對象obj,然後obj.m_PantsDerivedm_Pants。如果你想參考基礎成員,你可以使用obj.Base::m_Pants

如果你是在Base成員函數或有Base*指向Derived類型的對象,然後m_Pants總是指Base的成員,因爲在這些環境中不存在的類Derived和知識及其成員。

嗯,這不是代碼錯誤;這幾乎肯定是一個設計錯誤。

+0

我已經在C++ Builder6中嘗試過'int val = obj.Base :: m_Pants'並且得到了編譯錯誤:** E2247'Base :: m_Pants'無法訪問**(m_Pants是公開的) – 2010-05-05 01:35:46

+0

它只編譯獲取/設置funcs public:int getBase(){return Base :: m_Pants}' – 2010-05-05 01:43:19

+3

@Alexander:在示例代碼中,Derived'從'Base'私有繼承,所以,你說得對,工作。您需要將其更改爲公開繼承。 – 2010-05-05 01:43:44

1

一個變量影響另一個變量。這就好像你聲明瞭一個成員變量名x,然後有一個成員函數聲明它自己的x,除了這裏,其中一個變量在基類中,一個在派生類中。

int func(int x) 
{ 
    return x; 
} 

將返回x值是傳入的,而不是成員變量x的。一個變量「陰影」另一個變量。這就是爲什麼給你的變量命名是一個好主意,以便它們永遠不會有可能發生衝突的名稱。

相關問題