質問: new LaughClock(); bb->test(); Clock x; x.Tick(); LaughClock xx; xx.Tick(); estVirtual(); return 0; } ```
回答: 継承)とはオブジェクト指向を構成する概念の一つです。続けて引用します。 > > BがAを継承する場合、B is a A. (BはAの一種である)という意味的な関係(Is-a関係)が成り立つ。 > > > と説明されている通りで、質問の例では `LaughClock` が `Clock` を継承しているため `LaughClock` は `Clock` の一種であると言えます。そのため `LaughClock` から `Clock` への変換は可能です。しかし逆は成立しないため `Clock` から `LaughClock` への変換はできません。 > > 1. Clockのポインタ変数には new clock, new LaughClock 両方できて、なぜ逆のことである。LaughClockのポインタ変数では、new Clockができないのか > > > 上記の通り、`LaughClock` は `Clock` の一種であり、`Clock` は `LaughClock` の一種でないからです。 > > 2. DoAciton(Clock* pclock)の部分ですが、なぜクラス型の違うポインタを受け取っても > > 実行されるのでしょうか > > > 上記の通り、`LaughClock` は `Clock` の一種だからです。 C++言語ではdynamic_castを行うことで `Clock` から `LaughClock` への変換を試みることができます。もし変換できなかった場合は実行時に `std::bad_cast` 例外が投げられます。