【C++】多态 ⑪ ( 纯虚函数和抽象类 | 纯虚函数语法 | 抽象类和实现 | 代码示例 )

2023-11-04 09:02:38 浏览数 (1)

一、纯虚函数和抽象类


1、纯虚函数

纯虚函数 : 在 C 语言中 , " 纯虚函数 " 是 特殊类型的 虚函数 , " 纯虚函数 " 在 父类 中 声明 , 但是没有实现 ;

抽象类 : " 纯虚函数 " 的 作用 是将 父类 变为 " 抽象类 " , 该类不能被实例化 , 不能创建类的实例对象 ;

继承抽象类必须实现纯虚函数 : 任何从 " 抽象类 " 派生出来的 子类 都必须提供 " 纯虚函数 " 的实现 ;

父类 中的 " 纯虚函数 " 为 其若干子类 提供了一个 公共界面 , 用于 接口的 封装 / 设计 , 软件的 模块划分 ;

2、纯虚函数语法

纯虚函数语法 :

  • 函数前 使用 virtual 关键字修饰 ;
  • 函数声明后在 括号后面为函数 赋值 0 ;
代码语言:javascript复制
// 纯虚函数定义
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 . . .

0 人点赞