2009-02-23 98 views
25

這個問題說明了一切。我允許從結構中派生類,還是應該創建一個嵌入我的結構並定義複製構造函數的類,並在兩者之間移動一個=運算符?在C++中,我可以從結構中派生一個類

+0

MFC的類CRect繼承自struct tagRECT,AFAICS。 – Constantin 2009-02-23 16:18:05

+0

我的不好 - 問題文字改變了。 – 2009-02-23 17:58:36

回答

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的函數的參數,反之亦然。

相關問題