クラスに純粋仮想関数が含まれている場合、そのクラスは抽象クラスと呼ばれます。抽象クラスには実装されていない純粋な仮想関数があるため、抽象クラスを直接インスタンス化することはできません (つまり、抽象クラスのオブジェクトを作成することはできません)。
純粋仮想関数は、具体的な実装を持たずに基本クラスで宣言された仮想関数であり、値 0 を割り当てることで定義されます。派生クラスは、インスタンス化される基本クラスに純粋仮想関数を実装する必要があります。
抽象クラスの主な目的は、他のクラスの基本クラスとして機能し、派生クラスにインターフェイスと仕様を提供し、派生クラスに特定の機能を強制的に実装することです。したがって、抽象クラスは、抽象概念を提供する基本クラスとしてのみ使用できます。
以下は、抽象クラスの定義と使用制限を示す例です。
class Shape {
public:
virtual void draw() = 0; // 纯虚函数,没有实现体
};
class Circle : public Shape {
public:
void draw() override {
// 实现绘制圆形的代码
}
};
int main() {
// Shape shape; // 错误!无法实例化抽象类
Circle circle; // 正确!Circle 是一个具体的派生类,实现了所有纯虚函数
Shape* shapePtr = &circle; // 可以通过指针或引用访问抽象类的派生类对象
shapePtr->draw(); // 调用派生类的实现
}
派生クラスでは、基本クラス内のすべての純粋仮想関数を実装する必要があることに注意してください。実装しない場合、派生クラスは依然として抽象クラスとみなされます。
要約すると、純粋な仮想関数を含むクラス (抽象クラス) は直接インスタンス化できませんが、派生クラスによって実装および使用される基本クラスとして使用できます。
live555 ソース コードでは、BasicUsageEnvironment0 クラスの親クラスは、UsageEnvironment クラスです。BasicUsageEnvironment0クラスは、親クラスの純粋な仮想関数をすべて実装しているわけではないため、BasicUsageEnvironment0 クラスも抽象クラスであり、直接インスタンス化できません。
BasicUsageEnvironment クラスの親クラスは BasicUsageEnvironment0 クラスです。このクラスは、BasicUsageEnvironment0 クラスが実装していない他の純粋仮想関数を実装し、新しい純粋仮想関数を宣言しません。そのため、このクラスは抽象クラスではありません。そのコンストラクター BasicUsageEnvironment はprotected 属性なので、クラスを直接インスタンス化することはできません。また、BasicUsageEnvironment へのポインタは、クラス内に定義された createNew 関数を通じてのみ取得でき、そのクラスはポインタを通じて使用できます。