一、纯虚函数和抽象类
1、纯虚函数
纯虚函数 : 在 C 语言中 , " 纯虚函数 " 是 特殊类型的 虚函数 , " 纯虚函数 " 在 父类 中 声明 , 但是没有实现 ;
抽象类 : " 纯虚函数 " 的 作用 是将 父类 变为 " 抽象类 " , 该类不能被实例化 , 不能创建类的实例对象 ;
继承抽象类必须实现纯虚函数 : 任何从 " 抽象类 " 派生出来的 子类 都必须提供 " 纯虚函数 " 的实现 ;
父类 中的 " 纯虚函数 " 为 其若干子类 提供了一个 公共界面 , 用于 接口的 封装 / 设计 , 软件的 模块划分 ;
2、纯虚函数语法
纯虚函数语法 :
- 函数前 使用 virtual 关键字修饰 ;
- 函数声明后在 括号后面为函数 赋值 0 ;
// 纯虚函数定义
virtual 返回值类型 函数名(参数列表) = 0;
纯虚函数 定义 代码示例如下 :
代码语言:javascript复制 // 纯虚函数
virtual void pureVirtualFunction() = 0;
3、抽象类和实现
" 抽象类 " 就是在类中定义了一个 " 纯虚函数 " ,
" 抽象类 " 至少包含一个纯虚函数 , 抽象类 不能 创建 实例对象 , 只能作为其它类的 父类 ;
" 纯虚函数 " 是一种在 父类 中 声明但没有实现 的虚函数 , 其目的是使 父类 成为抽象类 ;
任何从抽象类派生出来的子类都必须提供 纯虚函数 的实现 ;
" 抽象类 " 代码示例 :
代码语言:javascript复制// 定义了纯虚函数的类就是抽象类
class AbstractClass {
public:
// 纯虚函数
virtual void pureVirtualFunction() = 0;
};
上述 AbstractClass 类是抽象类 , 该类不能创建实例对象 ;
- 否则会报错 error C2259: “AbstractClass”: 无法实例化抽象类 ;
子类 继承 AbstractClass 类 , 必须 实现 virtual void pureVirtualFunction() 函数 ;
下面代码中 , DerivedClass 派生类 , 继承 AbstractClass 抽象类 , 实现了 纯虚函数 pureVirtualFunction 函数 ;
实现的 纯虚函数 可以不使用 virtual 修饰 , 在 函数声明 最后添加 override 关键字 ;
代码语言:javascript复制// 派生类继承抽象类
class DerivedClass : public AbstractClass {
public:
// 实现纯虚函数
void pureVirtualFunction() override {
// 函数体
}
};
二、完整代码示例
抽象类 的 核心作用 就是 使用 抽象类类型指针 指向 子类对象 ,
使用 抽象类 指针 调用 纯虚函数 , 由于 父类 的 纯虚函数没有实现 , 实际调用的 是 子类对象的 函数 ,
该调用 发生了 多态 ;
代码示例 :
代码语言:javascript复制#include "iostream"
using namespace std;
// 定义了纯虚函数的类就是抽象类
class AbstractClass {
public:
// 纯虚函数
virtual void pureVirtualFunction() = 0;
};
// 派生类继承抽象类
class DerivedClass : public AbstractClass {
public:
// 实现纯虚函数
void pureVirtualFunction() override {
// 函数体
cout << "调用 DerivedClass 的 pureVirtualFunction 函数" << endl;
}
};
int main() {
// 抽象类不能实例化
// error C2259: “AbstractClass”: 无法实例化抽象类
//AbstractClass a;
// 使用抽象类指针 指向 子类对象
AbstractClass* p = new DerivedClass();
// 使用抽象类指针 调用 子类对象 实现的 纯虚函数
// 运用了 多态 原理
p->pureVirtualFunction();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
代码语言:javascript复制调用 DerivedClass 的 pureVirtualFunction 函数
Press any key to continue . . .