2009-02-23 12 views
25

質問は本当にすべてそれを言う。私は構造体からクラスを派生させることができましたか、または私の構造体を埋め込むクラスを作成し、コピーコンストラクタとその2つの間を移動する=演算子を定義する必要がありますか?C++では、構造体からクラスを派生させることができます

+0

MFCのクラスCRectは、struct tagRECT、AFAICSから継承しています。 – Constantin

+0

質問の文章が変わった。 –

答えて

33

C++ structclassと同義です(デフォルトのアクセスレベルは異なります)。

struct A { 
// fields are public by default 
}; 

class B: public A { 
// fields are private by default 
}; 

私はMFCに精通していませんが、CとC++ APIの両方を維持しようとしているようです。

+0

ありがとう。私はそれが大丈夫だったとはかなり確信していましたが、実際には実際にはそれを見たことはありませんでした –

9

もちろんです。継承に関して異なる点は、クラスを定義すると、他のクラス/構造体からプライベートを継承するということです。私はクラスにメンバーとしてそれらを組み込むだろう - あなたはCの構造体をラップする方法を疑問に思う場合

// 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構造体の保護されていない仮想デストラクタを考慮していないので、それらを持つことはできません)。それらはデータを収集する単純な集約です。そして、それらをメンバーとして使うことは、(「ある点にxとy座標のペアがある」のように)それらを使用します。

C structでは、クラス内で公開されるべきではないメンバーも公開します。包含は、公開されているものと取得/設定されていないものを正確に制御することができます。また、含まれている裸のC構造体オブジェクトへのコピーや参照を与えることができます。

7

はい。構造体からクラスを派生させることができます。 C++では、structは単なるクラスであり、デフォルトのアクセスはprivateではなくpublicです。非virualメンバ関数および/または静的関数のみを追加するクラスから構造体を派生させることは、CスタイルのAPIとの互換性を維持しながらC++インターフェイスを提供するのに便利なテクニックです。

これは、(あなたの質問に記載されているものとは反対に)多くのC構造体でMFCが使用する手法とまったく同じです。

たとえば、CRectクラスはstruct tagRECTから一般に派生しています(より一般的に使用される名前RECTはstruct tagRECTのtypedfです)。 struct tagRECTはすべてのデータメンバーを定義し、CRectは非仮想メンバ関数のみを追加するため、CRectとRECTのメモリレイアウトは同じです。CRECTを想定した関数の引数としてCRectを使用できます。

関連する問題