C++ Revisit for Embedded Engineer – §1. public継承とprivate継承の違い

これから、何回かに分けて組み込みエンジニア向けに、C++の内容を取り上げます。ほとんど、自分向けの備忘録となりますが、最初は「継承」について整理しておきます。

おさらい

通常、C++の継承は以下のように記述するかと思います。

通常は、基底クラスにpublicキーワードを明示的に記述することがほとんどですが、 省略した場合は、派生先がクラスか構造体かで扱われ方が変わります。

  • クラス”class“を派生とした場合は、privateキーワードがあるものと解釈される。
  • 構造体”struct“を派生とした場合は、publicキーワードがあるものと解釈される。 

C++ではclassキーワードを使用して、クラスを定義することが一般的なので、publicキーワードを省略してしまうと、いわゆる「private継承」として扱われます。これに対して、publicキーワードを明示的に記述した場合は、「public継承」となります。

public継承とは

public継承は、「is-a」の関係が成り立つ場合に使用するべきだと言われています。
具体的には、「派生クラス is a 基底クラス」となる関係で、例えば「Cat is a Animal」がこれに当たります。public継承では、基底クラスのpublicメンバに対して、外部からアクセスすることができます。また、派生クラスから基底クラスへの型変換(アップ・キャスト)も可能となります。

private継承とは

private継承では、基底クラスのすべてのメンバが外部に対してprivateになります。また、private継承ではアップ・キャストができません。

通常、C++でコーディングする際は、private継承を使用するケースは稀だと思います。public継承のような「is-a」の関係がない場合は、「is-implemented-in-terms-of」関係、いわゆるコンポジション(内包)を選択することが一般的です。しかし、private継承を使用したコンポジションの実現も可能です。

単純な内包との違いは、以下の通りです。

  • 基底クラスの仮想関数をオーバーライドできる。
  • protectedメンバにアクセスできる。

まとめ

上で見たように、C++の継承は複雑で使い方を間違えるとバグを生みかねません。とはいっても、private継承が必要になることは稀だと思いますし、private継承を必要とする実装は設計がおかしいケースがほとんどだと思います。従って、組み込み開発に限れば、とりあえずpublic継承を選択しておけばよいでしょう。ただし、継承はクラス間が「is-a」の関係のときに限りますが。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください