核心思想

面向对象程序设计(object-oriented programming)的核心思想是

  1. 封装:类的接口和实现分离
  2. 继承:定义相似的类型并对相似关系建模
  3. 动态绑定:在一定程度上忽略类的区别,而以统一的方式使用它们

继承

在C++中,将类型相关的函数与派生类不做改变直接继承 的函数区分对待。

对于类型相关的函数要声明为虚函数

//定义基类
class Quote{
public :
string isbn() const;
virtual double net_price(int n) const;
};
//定义派生类
class Bulk_Quote : public Quote{
public :
double net_price(int i) const override;
};
  1. 派生列表:派生类通过派生列表指出它的父类,每个父类前都有访问说明符

    public指出我们完全可以把Bulk_Quote当作Quote使用

  2. 基类通过virtual声明虚函数;派生类必须声明虚函数。可在派生类的虚函数后加上override显式表明它是重载的虚函数

动态绑定

通过使用动态绑定(dynamic binding),我们能用同一段代码分别处理Quote 和Bulk _quote的对象。

double print_total(ostream &os, const Quote &item,
int n){
//根据传入的参数的对象类型调用Quote::net_price
//或者Bulk_Quote::net_price
double ret = item.net_price(n);
os<<"ISBN: "<< item.isbn()
<<" # sold: "<<n<<" total due: "<<ret<<endl;
return ret;
}

由于传入的是基类对象,所以既可以传入基类对象,也可以传入派生类对象。

对象的类型决定了net_price的执行

//basic是Quote类型,bulk是Bulk_Quote类型
print_total(cout, basic, 20); //执行Quote的net_price
print_total(cout, bulk, 20); //执行Bulk_Quote的net_price

因为在上述过程在运行时选择函数的版本,所以动态绑定有时又被称为运行时绑定(run-time binding)

何时发生动态绑定?

使用基类的引用(或指针)调用一个虚函数

15-1 OOP概述的更多相关文章

  1. OOP 概述

    面向对象程序设计基于四个基本概念:数据抽象.封装.继承和动态绑定. 类的基本思想是数据抽象和封装. 1 数据抽象 数据抽象是一种依赖于接口和实现分离的编程技术.类的接口包括用户所能执行的操作:类的实现 ...

  2. python的oop概述

    python是面向对象的语言,那么究竟什么是面向对象? 首先理解类 类:在中文中的定义,许多相同或相似事物的综合.根据这个定义,类是许多相同或相似的实物聚在一起的.譬如,人类,鸟类,花类等. 面向对象 ...

  3. JS OOP 概述

    JS面向对象,大致内容 1.面向对象的基础 2.深入认识JS的函数 3.JS类的实现 4JS中共有成员,私有成员和静态成员 5.JS的反射 6.JS的继承 7.JS实现抽象类 8.JS事件设计模式 9 ...

  4. [C++ Primer] : 第15章: 面向对象程序设计

    OOP: 概述 面向对象程序设计的核心思想是数据抽象, 继承和动态绑定. 通过数据抽象, 我们可以实现类的接口与实现的分离; 使用继承, 可以定义相似的类型并对其相似关系建模; 使用动态绑定, 可以在 ...

  5. 【c++ Prime 学习笔记】第15章 面向对象程序设计

    15.1 OOP:概述 面向对象程序设计(object-oriented programming)的核心思想是:数据抽象.继承.动态绑定 使用数据抽象,可将类的接口与实现分离 使用继承,可定义相似的类 ...

  6. JavaSE_ 集合框架 总目录(15~18)

    JavaSE学习总结第15天_集合框架1 15.01 对象数组的概述和使用15.02 对象数组的内存图解15.03 集合的由来及与数组的区别15.04 集合的继承体系图解15.05 Collectio ...

  7. 标准C程序设计七---15

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  8. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  9. C++ Primer中文版(第5版)

    <C++ Primer中文版(第5版)> 基本信息 作者: (美)Stanley B. Lippman(斯坦利 李普曼)    Josee Lajoie(约瑟 拉乔伊)    Barbar ...

  10. JavaScript游戏中的面向对象的设计

    简介: 从程序角度考虑,许多 JavaScript 都基于循环和大量的 if/else 语句.在本文中,我们可了解一种更聪明的做法 — 在 JavaScript 游戏中使用面向对象来设计.本文将概述原 ...

随机推荐

  1. 【牛客刷题】HJ15 求int型正整数在内存中存储时1的个数

    题目链接 题倒是很简单,最开始用了这么一种解法: package main import "fmt" func main() { a := 0 fmt.Scan(&a) s ...

  2. disconf分布式配置管理(一) 安装与配置

    一.背景 在生产部署过程中,遇到以下问题: 1.由于节点较多,每次增量修改配置文件后都需要每个节点替换配置文件. 2.有些动态配置修改后,需要重启服务. 二.解决方案 1.使用linux文件共享配置文 ...

  3. C#自己封装数据库操作类BaseADO

    这几天学习数据库操作,就自己封装了一个数据库操作类,下面是代码展示 下面的例子是Access数据库 也可能用在Sql数据库中,只在在第一行代码上修改标识符即可 #define OLEDB_ using ...

  4. Kubernetes-13:存储卷Volume介绍及使用

    Volume介绍 Volume存在的意义 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题,首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失--容器以 ...

  5. 【YashanDB知识库】update/delete未选中行时,v$transaction视图没有事务,alter超时问题

    问题现象 1.alter table修改表字段名,卡住,超时. 2.查看v$transaction事务视图,没有看到事务记录. 3.问题单:调整表结构时超时 问题风险及影响 无风险 问题影响版本 客户 ...

  6. Angular Material 18+ 高级教程 – Custom Themes for Material Design 3 (自定义主题 Material 3)

    v18 更新重要说明 从 Angular Material v18 开始,默认使用的是 Material 3 Design (简称 M3). 而且是正式版,不再是 experimental previ ...

  7. CSS & JS Effect – Styling Select

    参考 YouTube – Custom select menu - CSS only 原装 select 的缺点 这是一个原装 select design 它最大的问题是没有 spacing. bor ...

  8. TypeScript 高级教程 – 把 TypeScript 当强类型语言使用 (第一篇)

    前言 原本是想照着 TypeScript 官网 handbook 写个教程的. 但提不起那个劲... 所以呢, 还是用我自己的方式写个复习和进阶笔记就好了呗. 以前写过的 TypeScript 笔记: ...

  9. Angular 学习笔记 (Typescript 版本更新)

    记入每一期我会用到的功能 : v4.3  1. getter setter 的类型可以不一样咯, 这个困扰很久了.  (interface, object, class 都可以这样用) class T ...

  10. 基于语义增强的少样本检测,突破新类别偏见 | ICIP'24

    Few-shot目标检测(FSOD)旨在在有限标注实例的情况下检测新颖对象,在近年取得了显著进展.然而,现有方法仍然存在偏见表示问题,特别是在极低标注情况下的新颖类别.在微调过程中,一种新颖类别可能会 ...