抽象クラスは、純粋仮想関数(Pure Virtual Function)が少なくとも1つ含まれているクラスです。純粋仮想関数は、関数の実装を持たず、派生クラスによってオーバーライドされる必要があります。
抽象クラスは、派生クラスに共通の性質や振る舞いを定義するために使用されます。以下に、抽象クラスの定義と使い方の例を示します。
class Animal {
public:
virtual void makeSound() = 0; // 純粋仮想関数
void sleep() {
cout << "Zzzzz..." << endl;
}
};
class Dog : public Animal {
public:
void makeSound() override {
cout << "Woof!" << endl;
}
};
class Cat : public Animal {
public:
void makeSound() override {
cout << "Meow!" << endl;
}
};
int main() {
Dog dog;
Cat cat;
dog.makeSound(); // 出力: Woof!
cat.makeSound(); // 出力: Meow!
dog.sleep(); // 出力: Zzzzz...
cat.sleep(); // 出力: Zzzzz...
// Animal animal; // コンパイルエラー: 抽象クラスのインスタンス化はできない
return 0;
}
上記の例では、Animalクラスが抽象クラスであり、純粋仮想関数であるmakeSound()関数を持っています。派生クラスのDogとCatは、この純粋仮想関数をオーバーライドすることが必要です。
抽象クラスのインスタンス化はできないため、Animalクラスのオブジェクトを作成することはできません。ただし、派生クラスのオブジェクトを通じて抽象クラスのメンバ関数を呼び出すことは可能です。
抽象クラスは、継承とポリモーフィズムの概念とともに使用されることが多く、プログラムの柔軟性と拡張性を高めるのに役立ちます。