笔记:C++学习之旅---面向对象程序设计2

面向对象程序设计基于三个基本概念:数据抽象、继承和动态绑定。

继承和动态绑定对程序的编写有两方面的影响:一是我们可以更容易的定义与其他类相似但不完全相同的新类:二是在使用这些彼此相似的类编写程序时,我们可以在一定程度上忽略掉它们的区别。

继承

通过继承联系在一起的类构成一种层次关系。通常在层次关系的根部有一个基类,其他类型则直接或间接的从基类继承而来,这些继承得到的类称为派生类。

在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时 基类将这些函数声明成虚函数

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


动态绑定

在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定。

定义派生类

派生类可以在他覆盖的函数前使用virtual关键字。C++11新标准中允许派生类显示的注明他使用某个成员函数覆盖了它的继承的虚函数。具体做法是在形参列表后面、或者在const成员函数的const关键字后面、或者在引用成员函数的引用限定符后面添加一个关键字override。

派生类使用基类的成员

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

防止继承的发生

练习15.7:
定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数量不超过一个给定的限量时享受折扣,如果购买量一旦超过了限量,则超出的部分将以原价销售。
#include
<iostream>
#include
<string>
using
namespace
std;

class
Quote
{
public
:
            Quote() =
default
;
            Quote(
const
string
&
b
,
double
p
) :bookNo(
b
), price(
p
){}
            
string
isbn()
const
{
return
bookNo; }
            
virtual
double
net_price(
size_t
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
&
b
,
double
p
,
size_t
q
,
double
disc
) :
                        
Quote
(
b
,
p
), min_qty(
q
), discount(
disc
){ }
            
double
net_price(
size_t
n)
const
override
;

private
:
            
size_t
min_qty = 0;
            
double
discount = 0.0;
};
double
Bulk_Quote
::net_price(
size_t
n
)
const
{
            
return
n
*price*(
n
>= min_qty ? 1 - discount : 1);
}
double
print_total(
ostream
&
os
,
const
Quote
&
item
,
size_t
n
)
{
            
double
ret =
item
.net_price(
n
);
            
os
<<
"ISBN:"
<<
item
.isbn()
                        <<
" #sold:"
<<
n
<<
" total due:"
<< ret << endl;
            
return
ret;
}
int
main()
{
            
Quote
q(
"textbook"
, 10.60);
            
Bulk_Quote
bq(
"textbook"
, 10.60, 10, 0.3);
            print_total(cout, q, 12);
            print_total(cout, bq, 12);
            
return
0;
}


笔记:C++学习之旅---面向对象程序设计2的更多相关文章

  1. [Python学习笔记][第六章Python面向对象程序设计]

    1月29日学习内容 Python面向对象程序设计 类的定义与使用 类定义语法 使用class关键词 class Car: def infor(self): print("This is ca ...

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

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

  3. 笔记-JavaWeb学习之旅7

    JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...

  4. 笔记-JavaWeb学习之旅5

    CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...

  5. 笔记-JavaWeb学习之旅19

    Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...

  6. 笔记-JavaWeb学习之旅18

    AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...

  7. 笔记-JavaWeb学习之旅17

    1.过滤选择器 首元素选择器:first 获得选择的元素中的第一个元素 尾元素选择器:last获得选择元素中的最后一个元素 非元素选择器:not(selector) 不包括指定内容的元素 偶数选择器: ...

  8. 笔记-JavaWeb学习之旅16

    增强对象的功能 动态代理:在内存中形成代理类 实现步骤: 代理对象和真实对象实现相同的接口 代理对象 = Proxy.newProxyInstance(); 使用代理对象调用真实对象的方法 增强方法 ...

  9. 笔记-JavaWeb学习之旅15

    Filter:过滤器 概念:当访问服务器的资源是,过滤器可以将请求拦截下来,完成一些特殊的功能 快速入门: 步骤: 定义一个类,实现接口Filter 复写方法 配置拦截路径 package com.d ...

  10. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

随机推荐

  1. IE浏览器下bootStrap form-control input输入框不显示兼容性问题

    问题背景 采用了如下代码. 主要时bootstrap 搜索框. 再IE11下表现出 input 明明 value有值,但是显示不出来的问题. 排查发现form-control样式去后功能正常,但是样式 ...

  2. VBA类模块完全教程(www.accessoft.com软件网)

    这份礼物送给现在想学习类知识或曾经学过但因为各种原因没有"修成正果"的朋友,我期望的结果是这篇文章后,您可以在类模块中像在标准模块中写代码一样熟练,我也期望不至于太乏味而使您没有耐 ...

  3. 002基本的Dos命令

    002基本的Dos命令 1.开启Dos控制台的几种方式 几种打开CMD的方式: 直接在菜单中搜索"命令提示符". Win+R,输入cmd.(推荐) 在任意文件夹下面,按住Shift ...

  4. 每日一道算法题——斐波那契数列Fibonacci

    题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1),n≤39: 示例1 输入: 4 返回值: 3 代码: 方法一:递归 publi ...

  5. python实现简单猜数字游戏

    #!/usr/bin/env python import os import random import sys import time def yanse(s): print('\033[25;31 ...

  6. Ubuntu 14.04环境编译android源码android-5.0.2_r1.7z

    环境: Win7:8G内存 vmware:vm给ubuntu分配4G内存80G空间 参考视频: https://www.bilibili.com/video/BV15t411R78o ubuntu14 ...

  7. Python相关练习说明

    Python练习情况说明 1.练习了在文件中进行统计的相关方法,基本操作其实差不多,步骤基本如下: # 1.打开相关文件,然后利用for循环进行按行读取的操作 # 2.读取的过程中,将读取到的数据加以 ...

  8. mybatis-spring注解MapperScan的原理

    很多开发者应该都知道,我们只使用@MapperScan这个注解就可以把我们写的Mybatis的Mapper接口加载到Spring的容器中,不需要对每个Mapper接口加@Mapper这个注解了,加快了 ...

  9. Debiased Contrastive Learning of Unsupervised Sentence Representations 论文精读

    1. 介绍(Introduction) 问题: 由PLM编码得到的句子表示在方向上分布不均匀, 在向量空间中占据一个狭窄的锥形区域, 这在很大程度上限制了它们的表达能力. 已有的解决办法: 对比学习. ...

  10. MySQL 数据库死锁问题

    在分析案例之前,我们先了解一下MySQL INNODB.在MySQL INNODB引擎中主键是采用聚簇索引的形式,即在B树的叶子节点中既存储了索引值也存储了数据记录,即数据记录和主键索引是存在一起的. ...