Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 純粋仮想メソッド | イントロダクション
C++ OOP原則

book純粋仮想メソッド

メニューを表示するにはスワイプしてください

仮想メソッドの概念は、多態性を実現し、柔軟で拡張性の高いソフトウェア設計を可能にする重要な要素です。純粋仮想メソッドは、インターフェースの定義や動的バインディングのサポートによって、この概念をさらに拡張します。

純粋仮想メソッドの構文

純粋仮想メソッドは、virtualキーワードを用いて宣言し、0で初期化します。これは、その関数がclass内で定義されておらず、サブクラスで必ずオーバーライドされなければ、そのclassオブジェクトをインスタンス化できないことを示します。

virtual.h

virtual.h

copy
1
virtual void example() = 0;

このメソッドは通常のメソッドと同様に機能しますが、本体がなく{ } で囲まれていない代わりに = 0; で終了し、実装がないことを示します。ただし、このメソッドに関する他の規則は通常のメソッドと同じです。

純粋仮想メソッドを宣言すると、そのメソッドが宣言されたclass抽象クラスとなり、classオブジェクトをインスタンス化することができなくなります。この制限は、すべてのメソッドが実装されていない状態でインスタンスを作成・使用すると、エラーや予測不能な動作を防ぐために存在します。以下のコードを参照してください:

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

Animal classには 純粋仮想メソッド speak() があり、このクラスからのオブジェクトのインスタンス化を防止。仮想メソッドの目的は、各動物が発する独自の音を表現すること。

メソッドを仮想化することで、各サブクラスが独自のバージョンを実装でき、動物ごとの音の個性を反映。純粋仮想として宣言することで、デフォルト実装が存在しないことを示し、派生クラスで具体的な実装が必要であることを強調。

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

これも妥当。Animal classのインスタンス生成は非現実的かつ直感的でない。このclass抽象的な概念を表し、さまざまな動物のカテゴリとして機能。一般的な動物には特定の動作がなく、クラスの抽象性を強調し、各動物固有の音を表現するためにサブクラスを作成する重要性を示す。

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Animal型のオブジェクトを直接作成することはできませんが、関数のパラメータとして利用することは可能です。先ほどのボタンの例と同様に、この手法は多態性を活用して、実行時に動的に動作を変更できる柔軟なプログラムを実現します。

Note
注意

異なるclassオブジェクトを関数に渡して出力結果を確認してください。また、抽象classオブジェクトを作成しようとして、純粋仮想メソッドが未実装のためにコンパイラがインスタンス化を防ぐ様子も試してみてください。

question mark

クラスが純粋仮想メソッドを含む場合、どうなりますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  15

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  15
some-alt