前回、多重継承に関する記事を書きました。
前回記事
C++は禁じ手である多重継承ができます。 他言語は基本的に多重継承を禁止しています(厳密にはインタフェースを使うことで可能)。 禁止している理由としては、単純にカオスになるからです。 ちなみに僕は元々Java屋さんというこ[…]
で、どうせならダイヤモンド継承(俗に菱形継承と呼ばれる)もやってみようではないかと。
てことで今回は、ダイヤモンド継承を「神&おとん&おかん&おれ」で実践してみます。
今回のソースコード
実行環境
「AWS Cloud9」です。
ダイアモンド継承とは
親クラスが複数いて、その上にさらに親クラスがいるパターンですね。
今回は「神&おとん&おかん&おれ」方式で行くので↓のような感じ。
ダイヤモンド継承のダメな例
ダメな例というか、うまくいってない例ですね。
これだと、Godが2体いることになるので、OreはどちらのGodを呼べばよいか分かりません。
これを回避するために、Godを「仮想基底クラス」として定義します。
ソースコードでは「virtual」を付けます。
ダイヤモンド継承を実装してみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <iostream> class God { public: void call_god() { std::cout << "ゴッドやで!" << std::endl; } }; class Oton : virtual public God { public: void call_oton() { std::cout << "おとんやで!" << std::endl; } }; class Okan : virtual public God { public: void call_okan() { std::cout << "おかんやで!" << std::endl; } }; class Ore : public Oton, public Okan { public: void call_ore() { std::cout << "おれやで!" << std::endl; } }; int main() { Ore ore; ore.call_god(); ore.call_oton(); ore.call_okan(); ore.call_ore(); } |
実行してみる
1 2 3 4 5 6 7 8 |
Running /home/ec2-user/environment/lambda/dangling_pointer.cc ゴッドやで! おとんやで! おかんやで! おれやで! Process exited with code: 0 |
おすすめ本
これおすすめやで。
まとめ
ダイヤモンド継承なんてやった日にゃ、もうカオスでしかないですね。
まあこういうのも実際に実装してみないとイメージ湧かないもんなんでやってみました。
さいなら。