什么是抽象类?
抽象类(Abstract Class)是一种特殊的类,它不能被直接实例化,但可以作为基类被其他类继承。抽象类的主要用途是定义一组接口规范,这些规范由派生类实现。
在C++中,抽象类是通过包含至少一个纯虚函数(Pure Virtual Function)来定义的。纯虚函数是一种没有具体实现的虚函数,它要求派生类必须提供具体的实现(除非派生类本身也是抽象类)。
抽象类并不是所有函数都是纯虚函数,它也可以包含普通虚函数和普通成员函数。
- 抽象类:不能实例化的类,至少包含一个纯虚函数。
- 纯虚函数:没有具体实现的虚函数,必须由派生类实现。
- 普通虚函数:可以有默认实现,派生类可以选择覆盖。
抽象类的定义
抽象类的定义形式如下:
class AbstractClass {
public:
virtual void pureVirtualFunction() = 0; // 纯虚函数
virtual void normalVirtualFunction() { /* 默认实现 */ } // 普通虚函数
};
抽象类的特点
-
不能实例化:
- 抽象类不能直接创建对象。如果尝试实例化抽象类,编译器会报错。
- 例如:
AbstractClass obj; // 错误:不能实例化抽象类
-
包含纯虚函数:
- 抽象类至少包含一个纯虚函数。纯虚函数的声明形式为
virtual 返回类型 函数名() = 0;
。 - 例如:
virtual void pureVirtualFunction() = 0;
- 抽象类至少包含一个纯虚函数。纯虚函数的声明形式为
-
可以包含普通成员函数和普通虚函数:
- 抽象类可以包含普通成员函数和普通虚函数,这些函数可以有默认实现。
- 例如:
virtual void normalVirtualFunction() { /* 默认实现 */ }
-
可以包含数据成员:
- 抽象类可以包含数据成员,这些数据成员可以被派生类继承和访问。
抽象类的示例
示例1:包含纯虚函数的抽象类
class AbstractClass {
public:
virtual void pureVirtualFunction() = 0; // 纯虚函数
};
class Derived : public AbstractClass {
public:
void pureVirtualFunction() override {
std::cout << "Derived pureVirtualFunction()" << std::endl;
}
};
int main() {
// AbstractClass obj; // 错误:不能实例化抽象类
Derived d;
d.pureVirtualFunction(); // 输出:Derived pureVirtualFunction()
return 0;
}
示例2:包含普通虚函数的抽象类
class AbstractClass {
public:
virtual void pureVirtualFunction() = 0; // 纯虚函数
virtual void normalVirtualFunction() { // 普通虚函数
std::cout << "AbstractClass normalVirtualFunction()" << std::endl;
}
};
class Derived : public AbstractClass {
public:
void pureVirtualFunction() override {
std::cout << "Derived pureVirtualFunction()" << std::endl;
}
void normalVirtualFunction() override {
std::cout << "Derived normalVirtualFunction()" << std::endl;
}
};
int main() {
Derived d;
d.pureVirtualFunction(); // 输出:Derived pureVirtualFunction()
d.normalVirtualFunction(); // 输出:Derived normalVirtualFunction()
return 0;
}
抽象类的作用
-
定义接口规范:
- 抽象类通过纯虚函数定义了一组接口规范,这些规范必须由派生类实现。这确保了派生类具有一致的行为。
-
提供默认实现:
- 抽象类可以包含普通虚函数和普通成员函数,这些函数可以提供默认实现,派生类可以选择覆盖或直接使用。
-
多态性: