公開継承

public-inheritance.png

is-aの関係の表現には公開継承を使え.A is-a BはAはBの一種である。

class A : public B{};

もっとわかりやすく
A=FF
B=RPG
としよう
「クラス FFはクラスRPGをpublicに継承する」
と書く時、はイコール
「FF型のオブジェクトはすべてRPG型のオブジェクトである。しかしその逆は必ずしも真でない」
RPGはFFよりも広い概念を示しているってこと。
FFが表しているのはRPGよりも狭い概念である。
RPG型のオブジェクトを使えるところならどこでもFF型のオブジェクトも同じように使える。
なぜなら、FF型のオブジェクトはRPGの一種だからだ。

必ずしも現実世界の概念に忠実でなくてもいい

必要のない継承は作らなくてもいいのだ。
たとえば、ペンギンクラスがあって、あなたのソフトウェアが鳥が飛ぶかどうか区別する必要がないなら、

class Penguin : public NonFlyingBird{}

じゃなくてそのまま
class Penguin: public FlyingBird{}

としてもいい。

現実世界のis-a関係がかならずしもpublic継承に適しているとは限らない。

たとえば、正方形is a長方形 はうまくいかない。(Effective C++より)

特徴

基底クラスのインターフェースを継承している。
基底クラスへの暗黙の変換が認められている

サポートサイト Wikidot.com