純粋仮想メソッド
メニューを表示するにはスワイプしてください
仮想メソッドの概念は、多態性を実現し、柔軟で拡張性の高いソフトウェア設計を可能にする重要な要素です。純粋仮想メソッドは、インターフェースの定義や動的バインディングのサポートによって、この概念をさらに拡張します。
純粋仮想メソッドの構文
純粋仮想メソッドは、virtualキーワードを用いて宣言し、0で初期化します。これは、その関数がclass内で定義されておらず、サブクラスで必ずオーバーライドされなければ、そのclassのオブジェクトをインスタンス化できないことを示します。
virtual.h
1virtual void example() = 0;
このメソッドは通常のメソッドと同様に機能しますが、本体がなく、{ } で囲まれていない代わりに = 0; で終了し、実装がないことを示します。ただし、このメソッドに関する他の規則は通常のメソッドと同じです。
純粋仮想メソッドを宣言すると、そのメソッドが宣言されたclassは抽象クラスとなり、classのオブジェクトをインスタンス化することができなくなります。この制限は、すべてのメソッドが実装されていない状態でインスタンスを作成・使用すると、エラーや予測不能な動作を防ぐために存在します。以下のコードを参照してください:
Animal.h
1234class Animal { public: virtual void speak() = 0; };
Animal classには 純粋仮想メソッド speak() があり、このクラスからのオブジェクトのインスタンス化を防止。仮想メソッドの目的は、各動物が発する独自の音を表現すること。
メソッドを仮想化することで、各サブクラスが独自のバージョンを実装でき、動物ごとの音の個性を反映。純粋仮想として宣言することで、デフォルト実装が存在しないことを示し、派生クラスで具体的な実装が必要であることを強調。
main.cpp
1234567#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
これも妥当。Animal classのインスタンス生成は非現実的かつ直感的でない。このclassは抽象的な概念を表し、さまざまな動物のカテゴリとして機能。一般的な動物には特定の動作がなく、クラスの抽象性を強調し、各動物固有の音を表現するためにサブクラスを作成する重要性を示す。
main.cpp
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型のオブジェクトを直接作成することはできませんが、関数のパラメータとして利用することは可能です。先ほどのボタンの例と同様に、この手法は多態性を活用して、実行時に動的に動作を変更できる柔軟なプログラムを実現します。
異なるclassのオブジェクトを関数に渡して出力結果を確認してください。また、抽象classのオブジェクトを作成しようとして、純粋仮想メソッドが未実装のためにコンパイラがインスタンス化を防ぐ様子も試してみてください。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください