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






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




    1、接口和抽象类


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

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

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


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


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

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


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


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


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

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

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

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

    // 定义了纯虚函数的类就是抽象类
    // 也可以用作接口
    class Interface {  
    public:  
    	// 纯虚函数  
        virtual void pureVirtualFunction() = 0;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7




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



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

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


    代码示例 :

    #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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

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

    在这里插入图片描述

  • 相关阅读:
    反转字符串中的元音字母
    带大量数据和公式的excel表格,手机打开数据正常,电脑打开数据就消失了
    PHP 主流ORM对比
    MATLAB环境下基于图像处理的视网膜图像血管分割
    【Git学习三】git中的分支管理:git branch,git checkout,解决git中的分支冲突的方法
    Typescript基本类型---上篇
    Postgresql源码(113)表达式JIT计算简单分析
    D. Divide and Equalize--Codeforces Round 903 (Div. 3)
    Direct3D粒子系统
    ansible file模块、参数详细讲解、例子
  • 原文地址:https://blog.csdn.net/han1202012/article/details/134223052