第10章 オブジェクト指向構文 / 第2回 模擬試験

次のコードの実行結果として正しいものはどれか。 ```php class Animal { public function speak() { return "..."; } } class Dog extends Animal { public function speak() { return "Bow!"; } } $animals = [new Animal(), new Dog()]; foreach ($animals as $a) { print $a->speak(); } ```

......
...Bow! 正解
Bow!Bow!
Bow!...
解説
ポリモーフィズム(多態性)により、同じ`speak()`という呼び出しでも、実際のオブジェクトのクラスに応じて異なるメソッドが実行されます。`Animal`のインスタンスは親クラスの`speak()`(`"..."`を返す)、`Dog`のインスタンスは子クラスでオーバーライドした`speak()`(`"Bow!"`を返す)が呼ばれます。 例: ``` class Animal { public function speak() { return "..."; } } class Dog extends Animal { public function speak() { return "Bow!"; } } $animals = [new Animal(), new Dog()]; foreach ($animals as $a) { print $a->speak(); } // 出力: ...Bow! ``` 呼び出す側(`foreach`のループ)は各要素が`Animal`型か`Dog`型かを意識せず、共通のインターフェース(`speak()`メソッド)を通じて処理できる点がポリモーフィズムの利点です。 (参照: 独習PHP 第4版 第10章 オブジェクト指向構文 10.3.2節 メソッドのオーバーライド p.500〜501)

あわせて読みたい解説記事