仮想クラス
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
基底クラスparentを継承する派生クラスchild_a, child_bがあり、さらにchild_a, child_b両方を継承するgrandクラスの定義を考えてみます。
スポンサーリンク
#include <iostream> class parent { public: int p; }; class child_a : public parent { public: int a; }; class child_b : public parent { public: int b; }; class grand : public child_a, public child_b { public: int g; }; int main() { grand obj; obj.g = 10; obj.p = 10; // エラーが起こる return 0; };
普通に上記のようにクラス継承を書きますと・・・
「’p’ へのアクセスがあいまいです。」と、コンパイルエラーが起こってしまいます。
これは、pが基底クラスparentで宣言されており、child_aとchild_bのそれぞれで、parentを継承しているためです。
つまり、「grand obj;」と一番下のクラスのインスタンスからparent::pにアクセスする際に、継承が2回起こります。
この問題を避けるためには、仮想クラスを用います。
child_aとchild_bのparent継承の宣言に、virtualキーワードをつけます。
#include <iostream> class parent { public: int p; }; class child_a : virtual public parent { public: int a; }; class child_b : virtual public parent { public: int b; }; class grand : public child_a, public child_b { public: int g; }; int main() { grand obj; obj.g = 10; obj.p = 10; return 0; };
と書いてやると、エラーを起こさずに、「obj.p = 10;」と代入が行えます。
virtualキーワードで、parentクラスは1回の呼び出しとなります。
スポンサーリンク
>> 次の記事 : 派生クラスによる関数の隠蔽
<< 前の記事 : 抽象クラス
- - 関連記事 -
- 派生クラスのコンストラクタ・デストラクタ
- 派生クラスによる関数の隠蔽
- 抽象クラス
- 仮想関数・virtualキーワード
- 親クラスの引数ありコンストラクタを子クラスから初期化・動的サイズのスタック
- クラスのアクセス制限キーワード・private, protected, public
- スタックを実装したクラスを拡張する
- クラス継承・親クラスと子クラス
- static・静的メンバ関数
- static・静的メンバ変数
- 定数のconstメンバ関数をクラスに宣言
- 定数のconstメンバ変数をクラスに宣言
- フレンドクラス・friend
- フレンド関数・friend
- クラスの中にメンバ関数(メソッド)を実装する
- explicit・コンストラクタを明示する
- クラスで自動的に生成されるメンバ関数
- コピーコンストラクタ
- 引数つきのコンストラクタを持つクラス定義
- コンストラクタで自動的に初期化する
スポンサーリンク