class Base
{
public:
type1 m_Pants;
};
class Derived : Base
{
public:
type2 m_Pants
};
這基本上沒有被標記爲錯誤,而是在整個項目中創建各種類型的clobbering和問題。在基類和派生類中相同名稱的對象沒有被標記爲錯誤
有沒有人知道不會標記這一點的技術性?
class Base
{
public:
type1 m_Pants;
};
class Derived : Base
{
public:
type2 m_Pants
};
這基本上沒有被標記爲錯誤,而是在整個項目中創建各種類型的clobbering和問題。在基類和派生類中相同名稱的對象沒有被標記爲錯誤
有沒有人知道不會標記這一點的技術性?
它正是它應該做的。派生的陰影基地。
它沒有被標記爲錯誤,因爲它不是錯誤。沒有什麼說你不能在派生類中擁有與基類中的成員相同的成員。
如果你有Derived
類型的對象obj
,然後obj.m_Pants
指Derived
的m_Pants
。如果你想參考基礎成員,你可以使用obj.Base::m_Pants
。
如果你是在Base
成員函數或有Base*
指向Derived
類型的對象,然後m_Pants
總是指Base
的成員,因爲在這些環境中不存在的類Derived
和知識及其成員。
嗯,這不是代碼錯誤;這幾乎肯定是一個設計錯誤。
我已經在C++ Builder6中嘗試過'int val = obj.Base :: m_Pants'並且得到了編譯錯誤:** E2247'Base :: m_Pants'無法訪問**(m_Pants是公開的) – 2010-05-05 01:35:46
它只編譯獲取/設置funcs public:int getBase(){return Base :: m_Pants}' – 2010-05-05 01:43:19
@Alexander:在示例代碼中,Derived'從'Base'私有繼承,所以,你說得對,工作。您需要將其更改爲公開繼承。 – 2010-05-05 01:43:44
一個變量影響另一個變量。這就好像你聲明瞭一個成員變量名x
,然後有一個成員函數聲明它自己的x
,除了這裏,其中一個變量在基類中,一個在派生類中。
int func(int x)
{
return x;
}
將返回x
值是傳入的,而不是成員變量x
的。一個變量「陰影」另一個變量。這就是爲什麼給你的變量命名是一個好主意,以便它們永遠不會有可能發生衝突的名稱。
函數可以被重載和覆蓋。會員不能。 「Derived :: m_pants」和「Base :: m_pants」完全是兩個不同的變量。如果你在一個小測試程序中使用'std :: cout << sizeof(Base)<<''<< sizeof(Derived)<< std :: endl;',你會發現'Derived'的大小大於'Base'。你甚至可以使變量使用相同的名稱和類型,但它們仍然是不同的變量,因爲它們屬於不同的類。 – Dustin 2010-05-05 01:12:24
啊,你把你使用的術語從「覆蓋」改爲「陰影」,從而使我的評論無效。感謝您修復它。 :) – Dustin 2010-05-05 01:18:38
@Dustin,謝謝你提高我的術語。 – 2010-05-05 01:21:14