文章目录
第 15 章 面向对象程序设计
15.1 OOP:概述
- 第 15 章 面向对象程序设计
- 15.1 OOP:概述
- 15.2 定义基类和派生类
- 15.2.1 定义基类
- 15.2.2 定义派生类
- 15.2.3 类型转换与继承
面向对象程序设计(Object-Oriented Programming)的核心思想是:
- 数据抽象(第 7 章)
- 继承
- 动态绑定
(1)继承
基类:Quote,表示按原价销售的书籍。
派生类:Bulk_quote,表示可以打折销售的书籍。
这些类将包含下面的两个成员函数∶
- isbn(),返回书籍的 ISBN 编号
- net_price(size_t),返回书籍的实际销售价格
在 C++ 中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数。因此将 Quote 类编写成:
class Quote
{
public:
std::string isbn() const;
virtual double net_price(std::size_t n) const; // virtual 表示此为虚函数
};
派生类必须通过使用类派生列表明确指出它是从哪个(哪些)基类继承而来的。
// Bulk_quote 继承了Quote
class Bulk_quote : public Quote
{
public:
double net_price(std::size_t) const override;
};
派生类必须在其内部对所有重新定义的虚函数进行声明。派生类可以在这样的函数之前加上 virtual 关键字,但是并不是非得这么做。
C++11 新标准允许派生类显式地注明它将使用哪个成员函数改写基类的虚函数,具体措施是在该函数的形参列表之后增加一个 override 关键字。
(2)动态绑定
通过使用动态绑定,我们能用同一段代码分别处理 Quote 和 Bulk_quote 的对象。
下面的函数负责打印总的费用:
// 计算并打印销售给定数量的某种书籍所得的费用
double print_total(ostream &os, const Quote &item, size_t n)
{
// 根据传入 item 形参的对象类型调用 Quote::net_price
// 或者 Bulk_quote::net_price
double ret = item.net_price(n);
//调用 Quote::isbn
os
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?