這個問題說明了一切。我允許從結構中派生類,還是應該創建一個嵌入我的結構並定義複製構造函數的類,並在兩者之間移動一個=運算符?在C++中,我可以從結構中派生一個類
25
A
回答
33
在C++ struct
(幾乎)與class
(除了不同的默認訪問級別除外)是同義詞,所以可以。
struct A {
// fields are public by default
};
class B: public A {
// fields are private by default
};
我不熟悉MFC,但它看起來像是嘗試維護C和C++ API。
9
當然,你是。關於繼承的不同之處在於,如果你定義了一個類,它將從其他類/結構中繼承私有。如果你定義一個結構和類或結構得到它,這將是一個公有繼承默認:
// the following two are equivalent except that one time class is
// used and the other time struct
struct f : g { };
class f : public g { };
如果你想知道你應該如何包裝,C的結構 - 我將它們嵌入作爲成員進級。因爲C結構不是被設計爲繼承的(想想C結構中既沒有受保護也沒有虛擬析構函數 - 它們不能有一個)。它們是收集數據的簡單集合。將它們作爲成員使用它們(如「一個點有一對x和y座標」)。
C結構還暴露了可能不應該暴露在課堂上的成員。 Containment允許精確控制什麼是暴露的,什麼不是通過獲取/設置函數,你仍然可以讓它給你一個副本或引用包含的裸C結構對象。
7
是的。你可以從一個結構派生一個類。在C++中,結構只是一個默認訪問是公共的而不是私有的類。從僅添加非虛擬成員函數和/或靜態函數的結構中派生類是一種有用的技術,可以在保持與C風格API兼容的同時提供C++接口。
這正是MFC用於許多C結構的方法(與您在問題中陳述的相反)。
例如,CRect類是從結構tagRECT公開派生的(更常用的名稱RECT是結構tagRECT的typededf)。因爲struct tagRECT定義了所有的數據成員,而CRect只添加了非虛擬成員函數,所以CRects和RECT的內存佈局是相同的 - 您可以使用CRect作爲任何需要RECT的函數的參數,反之亦然。
相關問題
- 1. C#是否可以從派生類中調用基類屬性
- 2. 我想從基類onLoad()覆蓋在c#中的派生類的控件(主頁從一個masterClass派生)
- 3. 從派生自同一類的類派生的C++子類
- 4. 包含派生類型的Fortran派生類型可以從C訪問
- 5. 爲什麼我可以從一個模板/通用類派生基於該類型在C#/ C++
- 6. C++訪問鹼的私人結構中派生類
- 7. 我可以在派生類中創建一個公共成員變量private嗎?
- 8. 我可以命名從接口派生的每個類嗎?
- 9. 爲什麼一個Struct不能從另一個結構派生?
- 10. C++中派生類的對象可以被父類訪問嗎?
- 11. C#。我可以自動替換派生類而不是基類
- 12. 我可以讓派生類在Java中從其基類繼承派生成員嗎?
- 13. 是否可以派生(RustcEncodable)的一部分結構?
- 14. 我可以在派生類中使用wxPython wx.ItemContainer嗎?
- 15. 我可以在activex控件中使用CView派生類嗎?
- 16. 在C++中調用的基類和派生類構造函數
- 17. 當我在C++中派生一個類時,它是否創建一個基類對象並將其作爲我的成員變量存儲在派生類中?
- 18. C#從多個抽象類派生一個類
- 19. 動態內存和C派生結構++
- 20. C++結構實現派生接口
- 21. 從調用派生類的基類構造函數在Java中
- 22. 引用返回結構/派生類型
- 23. 在C++中,我可以在不生成整個數據結構的情況下找到數據結構嗎?
- 24. C++派生類
- 25. C++派生類
- 26. 我們可以在類型上定義一個結構嗎?
- 27. 我是否應該在派生類中有一個構造函數?
- 28. 爲什麼我的派生類是一個抽象類? C++
- 29. 你能從一個非託管C++類派生一個託管C++類嗎?
- 30. 我可以在結構中放置一個函數嗎?
MFC的類CRect繼承自struct tagRECT,AFAICS。 – Constantin 2009-02-23 16:18:05
我的不好 - 問題文字改變了。 – 2009-02-23 17:58:36