2009-02-02 91 views
3

比方說,我有兩個類,如下列:繼承:我可以重寫基類數據成員嗎?

Class A 
{ 
public: 
.. 
private: 
    int length; 
} 

Class B: public Class A 
{ 
public: 
.. 
private: 
float length; 
} 

我想知道的是:

  1. 是否允許壓倒一切的基類的數據成員的?
  2. 如果是的話,這是一個很好的做法嗎?
  3. 如果不是,擴展類的數據成員類型的最佳方法是什麼?

有一個類可以滿足我的需求,我想重用它。但是,對於我的程序需求,其數據成員應該是另一種類型。

我有一些書,但他們都只提到重寫基類成員方法。

回答

7

您可以使用模板化成員即泛型成員,而不是覆蓋成員。

您還可以聲明一個VARIANT(COM)類似的聯合。

struct MyData 
    { 
     int vt;    // To store the type 

     union 
     {     
      LONG  lVal; 
      BYTE  bVal; 
      SHORT  iVal; 
      FLOAT  fltVal; 
      . 
      . 
     } 
    }; 
+0

如果你想要某個類的更多功能(類似於子類),他可以使用模板專門化嗎? – strager 2009-02-02 00:40:25

+0

是的,他可以專門化模板 – Vinay 2009-02-02 00:56:47

+0

這在技術上不是重寫;) – 2009-02-02 04:50:12

3

1)不,你不能。你可以創建你自己的內部/隱藏/私人成員,但你不能忽略它們。

2)如果可以的話,不是很好的做法。想想吧)

3)你不應該,因爲你正在改變成員的含義。

3

雖然在派生類中聲明一個具有相同名稱的數據成員是合法的C++,但它可能不會做你想要的。在您的示例中,A類中的任何代碼都不能看到float length定義 - 它只能訪問int length定義。

只有方法可以在C++中具有虛擬行爲,而不是數據成員。如果你想重用一個現有的類與另一種數據類型,你將不得不重新實現類與你想要的數據類型,或重新實現它作爲模板,所以你可以在實例化提供所需的數據類型。

0

1)是的,它是允許的,因爲,你可以做到這一點

2)沒有!不好的做法。如果有人調用一個使用'length'的方法,那麼返回的變量將是未定義的。

3)嘗試不同的設計。也許你想要一個類似命名的函數,或者使用基類作爲「has-a」類而不是「is-a」類。