前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】多态 ⑬ ( 多继承中应用 “ 抽象类 “ | 接口和抽象类 | C++ 语言中接口实现 | 只定义 纯虚函数 的 抽象类作接口 | )

【C++】多态 ⑬ ( 多继承中应用 “ 抽象类 “ | 接口和抽象类 | C++ 语言中接口实现 | 只定义 纯虚函数 的 抽象类作接口 | )

作者头像
韩曙亮
发布2023-11-08 09:59:58
1970
发布2023-11-08 09:59:58
举报
文章被收录于专栏:韩曙亮的移动开发专栏

一、多继承中应用 " 抽象类 "


1、接口和抽象类

接口 Interface 和 抽象类 AbstractClass 都是 面向对象编程 的重要概念 , 借助它们可以定义一个模板 , 令其他类 实现接口 或 继承抽象类 模板 , 可实现多态效果 , 这是面向对象最重要的操作 ;

  • Java 语言 中 , 有 明确的 接口 Interface 和 抽象类 AbstractClass 概念 ;
  • C++ 语言 中 , 没有 接口 Interface 概念 , 只有 抽象类 AbstractClass 概念 ;

2、编程语言对接口和多继承的支持

大部分 面向对象语言 不支持 多继承 , 即使是 C++ 语言 支持 多继承 , 也不推荐用户使用多继承 , 因为多继承会造成二义性等一系列问题 , 导致程序难以维护 ;

大部分 面向对象语言 支持 接口概念 , 一个类可以继承多个接口 ;

3、C++ 语言中接口实现

C++ 语言中 , 没有接口概念 , 这里使用 " 纯虚函数 " 实现接口 ;

接口类特点 : 接口类中 只有 函数原型 , 没有成员变量 , 函数原型 指的是 函数只有 返回值 函数名 和 参数列表 , 没有函数体 ;

C++ 中的 接口类 有如下要求 :

  • 类中只能定义纯虚函数 , 该类是一个抽象类 ;
  • 类中不能定义除纯虚函数之外的其它成员 , 如 普通函数 , 成员变量 ;

下面的类就是 只 定义了 纯虚函数 的 抽象类 , 可以当做接口使用 ;

代码语言:javascript
复制
// 定义了纯虚函数的类就是抽象类
// 也可以用作接口
class Interface {  
public:  
	// 纯虚函数  
    virtual void pureVirtualFunction() = 0;
};

二、代码示例 - 多继承中应用 " 抽象类 "


在 C++ 中 , 使用只定义了 纯虚函数 的 抽象类 , 作为接口 ;

借助 C++ 多继承的特性 , 继承多个 " 只定义了 纯虚函数 的 抽象类 " , 也就是接口 ;

代码示例 :

代码语言:javascript
复制
#include "iostream"
using namespace std;

// 定义了纯虚函数的类就是抽象类
// 这里使用抽象类作为接口使用
class Interface1 {
public:
	// 纯虚函数  
	virtual int add(int a, int b) = 0;
};

// 定义了纯虚函数的类就是抽象类
// 这里使用抽象类作为接口使用
class Interface2 {
public:
	// 纯虚函数  
	virtual int minus(int a, int b) = 0;
};

// 派生类继承抽象类
class DerivedClass : public Interface1, public Interface2 
{
public:
	// 实现纯虚函数
	int add(int a, int b) override {
		int ret = a + b;
		// 函数体 
		cout << "add 计算结果 : " << ret << endl;
		return ret;
	}

	// 实现纯虚函数
	int minus(int a, int b) override {
		int ret = a - b;
		// 函数体 
		cout << "minus 计算结果 : " << ret << endl;
		return ret;
	}
};

int main() {

	// 创建子类对象 , 通过子类调用接口方法
	DerivedClass d;
	d.add(1, 2);
	d.minus(1, 2);

	// 将子类对象赋值给接口指针 , 通过接口指针调用接口方法
	Interface1* i1 = &d;
	i1->add(1, 2);

	// 将子类对象赋值给接口指针 , 通过接口指针调用接口方法
	Interface2* i2 = &d;
	i2->minus(1, 2);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 : add 计算结果 : 3 minus 计算结果 : -1 add 计算结果 : 3 minus 计算结果 : -1 Press any key to continue . . .

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、多继承中应用 " 抽象类 "
    • 1、接口和抽象类
      • 2、编程语言对接口和多继承的支持
        • 3、C++ 语言中接口实现
        • 二、代码示例 - 多继承中应用 " 抽象类 "
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档