c++ oop面向对象

2023-11-01

定义基类

//基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此。

//基类必须将它的两种成员函数区分开来,

//一种是基类希望其派生类进行覆盖的函数,既虚函数,使用virtual关键字

//一种是基类希望派生类直接继承而不要改变的函数

class Quote

{

public:

Quote() = default;

Quote(const string& book, double sa_price) :bookNo(book), price(sa_price)

{}

virtual double net_price(int n) const

{

return n * price;

}

virtual ~Quote() = default;//对析构函数动态绑定

private:

string bookNo;

protected:

double price = 0.0;

};

定义派生类

//派生类必须通过使用类派生列表明确指出它是从那个(那些)基类继承而来。

//类派生列表是冒号后边以逗号隔开的基类列表,可以在每个基类前加访问说明符。

//派生类必须将继承而来的需要覆盖的函数重新声明。

//一个派生类对象包含多个组成部分,一个是派生类自己定义的成员,和继承来的基类的成员。

//如果派生类没有覆盖其基类中的某个虚函数,则该虚函数的行为类似于其他普通成员,派生类会直接继承其在基类中的版本。

//派生类也必须使用基类的构造函数来初始化它的基类部分。

class Bulk_quote : public Quote

{

public:

Bulk_quote() = default;

Bulk_quote(const string&, double, int, double);

double net_price(int) const override;

~Bulk_quote();

private:

int min_qty = 0;

double discount = 0.0;

};

//每个类控制自己的成员初始化过程

//首先初始化基类的成员部分,然后按照声明的顺序依次初始化派生类的成员

Bulk_quote::Bulk_quote(const string& book, double p, int qty, double disc) :

Quote(book, p), min_qty(qty), discount(disc) {}

//派生类可以访问基类的共有成员和受保护成员

double Bulk_quote::net_price(int n) const

{

if (n >= min_qty) return n * (1 - discount) * price;

else return n * price;

}

Bulk_quote::~Bulk_quote()

{}

void ShowPrice(const Quote& quote)

{

cout << quote.net_price(0) << endl;

}

int main()

{

面向对象程序设计

//核心思想是数据抽象、继承和动态绑定

//通过继承联系在一起的类构成一种层次关系为继承关系

//基类:通常在层次关系的根部,其他类直接或间接地从基类继承而来。

//派生类:这些继承得到的类称为派生类。

//基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。

 

 

//因为在派生类中有与基类对应的组成部分,所以可以将基类的指针或引用绑定到派生类对象中的基类部分。

Quote item;//基类对象

Bulk_quote bulk;//派生类对象

Quote* p = &item;//指向Quote对象的指针

p = &bulk;//p指向bulk的Quote部分

Quote& t = bulk;//r绑定到bulk的Quote部分

 

//使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。

//在使用基类的引用或指针调用一个虚成员函数时会执行动态绑定。

ShowPrice(item);//使用的是Quote的net_price

ShowPrice(bulk);//使用的是Bulk_quote的net_price

//函数的运行版本由实参决定,在运行时选择执行的版本,动态绑定就称为运行时绑定。

 

继承与静态成员

//如果基类继承了静态成员,则在整个继承体系中只存在该成员的唯一定义。

//如果基类的静态成员是private的,则派生类不能访问。

 

//防止继承的发生,可以类名字后跟一个关键字final。

//class Base final{}//Base不能作为基类,应为它不能被继承,成员函数和成员变量都可以用final来修饰。

 

类型转换与继承

//在使用继承关系时要区分表达式的静态类型和动态类型。静态在编译时总是已知的,动态类型在运行时才可知。

//不存在从基类向派生类的隐式类型转换

//对象之间不存在类型转换,派生类向基类的自动类型转换只对指针或引用有效。

//当我们用过一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,派生类的其他部分将被忽略掉。

//派生来向基类的类型转换也可能会由于访问受限而不成功。

Bulk_quote bbulk;//派生类对象

Quote iitem(bbulk);//使用的是派生类中的基类部分初始化的Quote构造函数

iitem = bbulk;//调用的是Quote::operator=(const Quote&)

return 0;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ oop面向对象 的相关文章

随机推荐

  • python(10):批量修改文件名

    文章目录 1 使用Python的字符串操作来去除文件名高位的多余零 说明 代码 示例 2 将文件夹中的文件重命名为递增的数字加上原始文件名的后缀 代码 运行前后 1 使用Python的字符串操作来去除文件名高位的多余零 说明 一个目录下的文
  • YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额1元起步 多少随意 锋影 email 174176320 qq com YUV图解 YUV444 YUV422 YUV420 YV12 NV12 NV21 YUV格
  • 如果你的开发板上STM32采用外部晶振,那么就不能选择BYPASS Clock Source (旁路时钟源)模式,否则STM32将会工作不正常。

    如果你的开发板上STM32采用外部晶振 那么就不能选择BYPASS Clock Source 旁路时钟源 模式 否则STM32将会工作不正常 BYPASS Clock Source 旁路时钟源 指无需使用外部晶体时所需的芯片内部时钟驱动组件
  • 博客图片被设置防盗链接?别慌,我爆肝三晚写了这个批量图片站点转移脚本(已开源)

    我个人经常在CSDN上进行写作 前一段时间我选择自己建站 为了省事 我直接使用了CSDN上的图片地址 当你在CSDN上写作时你上传的图片会存储在CSDN的服务器中 可以直接在网页上输入URL访问 但是上周CSDN开始对图片施加防盗链接了 我
  • 渣本零基础努力自学python,半年成功上岸,良心分享学习心得和踩坑经历

    前言 写这篇文章想了很久很久 到底该怎么写 关于零基础学python 观点很多 以下每个字都是经验所得 都是站在一个零基础的人的角度写的 纯手打 网上优秀资源整合 希望大家能认真看 接下来文章会侧重在以下几方面 1 零基础如何学习pytho
  • 新买的电脑怎么装系统_u盘装系统怎么装iso文件

    导读 u盘装系统怎么装相关问题 下面191路由网小编为大家详细解答 在办公的过程的 U盘是必不可少的工具 但是也有不少用户不知道U盘还能用来重装系统 为了让大家都可以自己动手重装系统 今天就特地整理了这篇教程来教大家电脑怎么用u盘装系统 大
  • java中用while循环和for循环实现输入数字求和与求平均数

    首先我们先创建一个主方法 然后在主方法下编写实现代码 首先创建一个扫描器 来接收键盘输入数据 这里我们会用到java里的Scanner这个工具包 然后输入一下提醒用户输入数字 public static void main String a
  • 联想小新air14 降频问题

    联想小新air14 2020款 AMD版本 当CPU温度过高会锁频在0 4G 降温降功率之后好一阵才能正常运行 解决方案 AMD版本下载软件Ryzen Controller Intel卡有自己的软件throttlestop或者XTU 使用软
  • 【SGU 176】 Flow construction

    176 Flow construction time limit per test 0 5 sec memory limit per test 4096 KB input standard output standard You have
  • JAVA中重载和重写的区别

    重载 重载发生在同一类中 方法名一样 参数列表不同 不关心返回值类型和权限修饰符是否相同 class Test public void test 方法名相同参数列表相同 即便返回值类型不同也不是重载 会抛出异常 public int tes
  • 微信小程序 canvas服务器图片,微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)...

    最近在学小程序 在把当前画布指定区域的内容导出并生成图片保存到本地这个知识点上踩坑了 这里用到的方法是 wx canvasToTempFilePath 该方法作用是把当前画布指定区域的内容导出生成指定大小的图片 并返回文件路径 详情 看文档
  • Typora 闭合二重、三重积分不美观问题

    参考链接 知乎的二重闭曲面积分号怎么输入 Maxwell的回答 知乎 结论 1 行内公式 二重 int kern 7pt int kern 21mu bigcirc 三重 int kern 8 5pt int kern 8 5pt int
  • Git常用命令速查表

    转载来源 web项目聚集地 https mp weixin qq com s GNgmT9e8 Ps2D5ib7WR44w 名词 master 默认开发分支 origin 默认远程版本库 Index Stage 暂存区 Workspace
  • Git第四讲 中文乱码解决

    解决GIT中文乱码问题 ls不能显示中文目录 解决办法 在git git completion bash中增加一行 alias ls ls show control chars color auto git commit不能提交中文注释 解
  • linux内核网络子系统初探2---socket层

    linux内核网络子系统初探2 socket层 一 内核网络socket层相关 接着上文 从这章开始 将按照五层网络模型的顺序逐层分析内核代码 linux1 0网络协议栈部分代码如下 root localhost linux 1 0 ls
  • 操作系统-基础

    目录 1 冯诺依曼体系推导与介绍 2 外存与内存 3 操作系统 什么是进程 进程控制块 PCB 调度算法 并发与并行 1 冯诺依曼体系推导与介绍 计算机的作用就是为了解决人的问题 而要解决问题 首先需要将数据或是问题输入到计算机当中 所以计
  • 微信小程序 检测返回事件 左上角返回按钮

    微信小程序 检测返回事件 微信小程序暂时来说没有相对应的检测左上角的返回按钮的事件 不过可以利用app js和onShow事件来完成这个小功能 1 主要就是在app js里面为页面设置相对应的值 例如a页面跳到b页面 然后从b页面返回a页面
  • 【python 2】python 进阶

    文章目录 一 函数 1 函数的参数 2 全局变量和局部变量 3 内部函数 4 闭包 5 匿名函数 6 系统自带的函数 7 递归函数 二 文件操作 三 os 模块 1 os path 2 os 里边的函数 四 异常 五 推导式 1 列表推导式
  • 安卓平板标注pdf,坚果云+zotero+xodo

    问题描述 之前买了个平板 但是使用zotero编辑pdf会出现不能保存等问题 也就是无法实现安卓平板标注pdf且能够多平台同步 WPS是保存到本地一个副本 福昕阅读器提示只能另存或者放弃编辑 静读天下直接就没有保存 这里指的是坚果云app里
  • c++ oop面向对象

    定义基类 基类通常都应该定义一个虚析构函数 即使该函数不执行任何实际操作也是如此 基类必须将它的两种成员函数区分开来 一种是基类希望其派生类进行覆盖的函数 既虚函数 使用virtual关键字 一种是基类希望派生类直接继承而不要改变的函数 c