• 締切済み

クラス間の関係

単行本、CD、DVDの三つを著作物と見たときのモデル化する時、これらの共通点は作者、出版社、出版時間、単価、内容などであるから、これらをクラスの属性にします。でも、各クラスは内容の取得方式が違います。本は目で、CDは耳で、DVDは目と耳両方で取得ができます。この観点から三つクラスの関係を示していいですか、ちょっと分からないです、そして、クラス図に書くとどういうになるでしょうか?   宜しく、お願いします。

みんなの回答

  • Fooky
  • ベストアンサー率71% (59/82)
回答No.1

「三つクラスの関係を示す」「クラス図」というのが よく分かりませんが、こういうことをしたい ということなんでしょうか?      Media     /   \ VisualMedia AudioMedia     \   /      AVMedia (下のクラスが上のクラスを継承している) class Media {   string author;   string publisher;  ... }; class VisualMedia : virtual public Media {   string sentences;  public:   void readContent(); }; class AudioMedia : virtual public Media {   const int audioDataBytes = 1000000;   char audioData[audioDataBytes];  public:   void playAudio(); }; class AVMedia : public VisualMedia, public AudioMedia { }; クラス"Media"は、作者、出版者などの情報を 格納しておくクラスです。 クラス"VisualMedia"は、クラス"Media"を継承して、 文字情報とそれを読み出すメンバを付け加えたもの。 クラス"AudioMedia"は、クラス"Media"を継承して、 音情報とそれを再生するメンバを付け加えたもの。 クラス"AVMedia"はクラス"VisualMedia"と"AudioMedia"を 継承したもの。 このとき注意すべきは、"VisualMedia"と"AudioMedia"で、 "Media"を仮想継承しておかないといけないということです。 同一の基底クラスを持つ2つ以上のクラスから多重継承する 際には仮想継承をしないと、派生クラス内に基底クラスが 2つ以上存在することになります。(その結果、基底クラス へのアクセスに曖昧性が生じ、コンパイルエラーになると 思います) 重複して継承される可能性のある基底クラスを 仮想継承しておくことで、そのような場合にも 基底クラスが1つしか存在しなくなります。

関連するQ&A