抽象クラスはインスタンス化できない。どうすれば解決できますか?
C++において、抽象クラスとは純粋仮想関数を含んだクラスを指し、純粋仮想関数は関数の宣言部に「= 0」を記述することで宣言します。抽象クラスは純粋仮想関数を含むため、直接インスタンス化することはできません。
この問題を解決するには、次の2つの方法があります。
- 抽象クラスを継承するサブクラスを作成し、抽象クラス内の純粋仮想関数を実装します。これにより、サブクラスはインスタンス化可能になり、サブクラスオブジェクトを使用して抽象クラス内の非純粋仮想関数にアクセスできます。
class AbstractClass {
public:
virtual void pureVirtualFunction() = 0;
void nonPureVirtualFunction() {
// 实现非纯虚函数的逻辑
}
};
class ConcreteClass : public AbstractClass {
public:
void pureVirtualFunction() {
// 实现纯虚函数的逻辑
}
};
int main() {
ConcreteClass obj;
obj.pureVirtualFunction();
obj.nonPureVirtualFunction();
return 0;
}
- インターフェイスを指すポインタ, リファレンスの利用法: インターフェイスのインスタンス化は直接的にはできませんが、インターフェイスを指すポインタやリファレンスを作成し、それらをインターフェイスを実装する具象サブクラスのオブジェクトに関連付けることができます。ポインタやリファレンスは実装サブクラスの純粋仮想関数以外の関数にアクセスするために利用できます。
class AbstractClass {
public:
virtual void pureVirtualFunction() = 0;
void nonPureVirtualFunction() {
// 实现非纯虚函数的逻辑
}
};
class ConcreteClass : public AbstractClass {
public:
void pureVirtualFunction() {
// 实现纯虚函数的逻辑
}
};
int main() {
ConcreteClass obj;
AbstractClass* ptr = &obj;
ptr->pureVirtualFunction();
ptr->nonPureVirtualFunction();
return 0;
}
抽象クラスはそのいずれの方法によっても直接インスタンス化することができませんが、サブクラス化やポインタ/参照を使用することで回避できます。