10.2 继承与多态

ops/2025/3/10 11:21:21/

文章目录

继承

在这里插入图片描述
继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性,派生类提供更丰富的属性和行为。在构造派生类时,其基类构造函数先被调用,然后是派生类构造函数。在析构时顺序刚好相反。

// 基类 LinearList
class LinearList{int *buffer;int size;
public:LinearList(int num){size = (num>10)?num:10;buffer = new int[size];}~LinearList(){delete []buffer;}bool insert(int x, int i);  // 线性表第i个元素后插入新元素,返回成功或失败bool remove(int &x, int i); // 删除线性表第i个元素,返回成功或失败int element(int i) const; // 返回线性表第i个元素, const表示不会修改调用它的对象的任何非静态成员数据int search(int x) const; // 查找值为x的元素并返回其序号int length() const; //返回线性表的长度
};
// 派生类 Queue
class Queue:private LinearList{  // 基类的公有和保护成员均变成派生类的私有成员
public:bool enQueue(int x){  // 元素x入队,返回操作成功或失败return insert(x, length());}bool deQueue(int &x){  // 元素出队, x带回队头元素return remove(x, 1);}
};
// 派生类 Stack
class Stack:private LinearList{
public:bool push(int x){  // 元素x入栈,返回操作成功或失败return insert(x, 1); }bool pop(int &x){  // 元素出栈,x带回栈顶元素return remove(x, 1);}
};

多态

在这里插入图片描述
多态的作用是使用一个接口调用多种方法,具体调用哪个函数,是在程序运行时决定的。实现多态,需要在派生类中定义与基类成员函数完全相同的方法签名(返回值、函数名、形参都完全一样)。作用在普通成员函数上,称为重置或覆盖。作用在虚成员函数上,称为实现。虚函数的前面都有virtual关键字,纯虚函数名末尾还有"=0"的标记,纯虚函数仅有定义,没有函数实现,当作接口使用。含有纯虚函数的类称为抽象类,不能创建对象,只能被继承。只有类的成员函数才能是虚函数,静态成员函数不能是虚函数,构造函数不能是虚函数,析构函数可以是虚函数。

#include <iostream>
#include <math.h>
// 基类
class Figure{
public:virtual double getArea() = 0; // 纯虚函数
}; // 千万不要忘记这个分号
// 派生类 Rectangle
class Rectangle:public Figure{
protected:double height;double width;
public:Rectangle(){}Rectangle(double height, double width){this->height = height;this->width = width;}double getArea(){return height*width;}
};
// 派生类 Triangle
class Triangle:public Figure{double la;double lb;double lc;
public:Triangle(double la, double lb, double lc){this->la = la;this->lb = lb;this->lc = lc;}double getArea(){double s = (la+lb+lc)/2.0;return sqrt(s*(s-la)*(s-lb)*(s-lc));}
};
// 主函数
void main(){Figure *figures[2] = {new Triangle(2,3,3), new Rectangle(5,8)};for(int i=0; i<2; i++){std::cout << "figures[" << i << "] area=" << figures[i]->getArea() << std::endl;delete figures[i];}
}

http://www.ppmy.cn/ops/164645.html

相关文章

【AVRCP】协议深入解析(1):从框架到数据单元

目录 一、AVRCP 协议框架 1.1 AV/C 命令 1.2 AVRCP 特定的 AV/C 命令 1.3 AVRCP 特定的浏览命令 二、定时器设置 三、协议数据单元(PDU)描述 3.1 PDU 格式概述 3.2 AVRCP 特定的 AV/C PDU 格式 3.3 AVRCP 特定的浏览 PDU 格式 四、总结 五、参考文献 AVRCP(Audio…

让知识触手可及!基于Neo4j的机械设备知识图谱问答系统

让知识触手可及&#xff01;基于Neo4j的机械设备知识图谱问答系统 在信息化迅速发展的今天&#xff0c;我们如何高效地利用海量数据&#xff1f;我们推出的“机械设备知识图谱问答展示系统”&#xff0c;正是为了解决这个难题而生。这个系统不仅能帮助我们快速获取机械设备的知…

介绍一下Qt中的动态属性

在 Qt 中&#xff0c;动态属性是一种强大且灵活的特性&#xff0c;它允许你在运行时为对象添加、修改和查询属性&#xff0c;而不需要在类的定义中预先声明这些属性。下面为你详细介绍 Qt 动态属性的相关内容&#xff1a; 1. 动态属性的基本概念 在传统的 C 类中&#xff0c;属…

用Python写一个算24点的小程序

一、运行界面 二、显示答案——递归介绍 工作流程&#xff1a; 1. 基本情况&#xff1a;函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字&#xff0c;它会判断这个数字是否接近 24&#xff08;使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址&#xff0c;每次启动虚拟机服务都是不一样的 IP&#xff0c;因此要配置静态 IP 地址避免每次都发生变化&#xff0c;下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念&#xff1a; 动态 IP…

DeepSeek 开源周回顾「GitHub 热点速览」

上周&#xff0c;DeepSeek 发布的开源项目用一个词形容就是&#xff1a;榨干性能&#xff01;由于篇幅有限&#xff0c;这里仅列出项目名称和简介&#xff0c;感兴趣的同学可以前往 DeepSeek 的开源组织页面&#xff0c;深入探索每个项目的精彩之处&#xff01; 第一天 FlashML…

RK Android14 应用打开蓝牙时去掉确认提示

文章目录 需求解决 需求 在应用进行打开蓝牙操作时&#xff0c;不弹出确认提示&#xff0c;直接默认通过。 解决 路径&#xff1a;packages/apps/Settings/src/com/android/settings/bluetooth/RequestPermissionActivity.java diff --git a/packages/apps/Settings/src/com…

【GoTeams】-3:构建api、重构错误码

本文目录 1. 构建api梳理调用关系api包的作用路由梳理注册Register代码语法 2. 重构错误码 1. 构建api 首先复制project-user&#xff0c;改名为project-api&#xff0c;放在总的路径下&#xff0c;然后在工作区中进行导入。 运行命令go work use .\project-api\新建工作区之…