Essential C++ 笔记-1
本文作者为C++初学者,学习之中难免有误,该文章仅为参考
面向对象概述
继承:改变类之间的关系
多态:让基类的pointer或refence得以十分透明的指向基类的某个派生对象
继承
继承发生在对象与对象之间,通常由一个基类所派生出来
假设现有Libmat类和从Libmat中继承出的Book类
现有
void load_check_in(Libmat &mat)
{
// mat 实际上代表由Libmat派生出来的的对象,如Book, Files
mat.check_in();
if (mat.is_late())
mat.access_fine();
if(mat.wating_list())
mat.notify_available();
}
假设程序中并没有Libmat对象,而只有其派生对象那么check_in该如何解释,在程序运行过程中调用的到底是Libmat的check_in还是Book的check_in?,此实程序被决议(resloved)
为解决上述问题引入动态绑定(Dynamic binding)机制,虚拟函数实现动态绑定,通过在成员函数前添加 __virtual__关键字即可构建出一个虚拟函数
class Libmat{
public:
virtual void check_in() const{
cout << "This is a Libmat";
}
}
class Book : public Libmat{
public:
void check_in() const {
cout << "This is a Book";
}
}
将基类中的check_in设置为虚拟函数, 则在派生类中定义的同名函数前可不加 virtual,默认情况下编译器会在静态编译时完成决议,但引入虚拟函数之后,决议将会发生在动态编译时,将根据调用check_in 的对象的具体类型来调用相应的函数。
也可以将这种行为理解为覆盖,在基类中的check_in函数在Book类调用时,被Book类的check_in函数覆盖,如果还想使用Libmat类的check_in函数,可以通过添加Libmat::(class scope修饰符)来指定决议结果。
其中继承过来的成员函数,与派生类的成员函数无需区分,他们的使用并无显著差异
在公开继承(public Inheritance)的情况下,基类的public member同样提供给派生类来使用,基类的protected同样也称为派生类的protected,也提供给派生类使用,但基类的private完全不提供给派生类使用,
private 对象只能够被该对象的成员函数调用,除此之外都不能被调用,直接调用也不可以。
根据一般规则凡基类中定义有一个或多个虚拟函数应该要将其destructor 声明为virtual
初始化派生类时必须初始化基类
Essential C++ 笔记-1的更多相关文章
- EC读书笔记系列之16:条款35、36、37、38、39、40
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...
- Essential C++ 学习笔记02--Array/Vector 与指针
Essential C++ 1.5-1.6节,3.1节笔记 Array/Vector/指针,难度偏大, 但若学习初期不熟悉基本用法,则难以写出有效代码. 1. 基本概念 Array 是一段连续内存,数 ...
- Essential C++ 学习笔记01--基本语法
<Essential C++>1.1-1.4节笔记 1. main 函数 main 函数是代码的入口,若无 main 函数,编译不通过. main 函数通常声明为 int, return ...
- Essential C#读书笔记
Essential C#读书笔记 这是一个多变的时代,一次又一次的浪潮将不同的人推上了巅峰.新的人想搭上这一波,同时老的人也不想死在沙滩上.这些年新的浪潮又一次推开,历史不停地重复上演,那便是移动互联 ...
- 《Essential C++》读书笔记 之 目录导航
<Essential C++>读书笔记 之 目录导航 2014-07-06 第一章:<Essential C++>读书笔记 之 C++编程基础 第二章:<Essentia ...
- 《Essential C++》读书笔记 之 C++编程基础
<Essential C++>读书笔记 之 C++编程基础 2014-07-03 1.1 如何撰写C++程序 头文件 命名空间 1.2 对象的定义与初始化 1.3 撰写表达式 运算符的优先 ...
- 《Essential C++》读书笔记 之 面向过程编程风格
<Essential C++>读书笔记 之 面向过程编程风格 2014-06-18 2.2 调用(invoking)一个函数 2.2.1 Pass by Reference语义 在函数sw ...
- 《Essential C++》读书笔记 之 泛型编程风格
<Essential C++>读书笔记 之 泛型编程风格 2014-07-07 3.1 指针的算术运算(The Arithmetic of Pointer) 新需求1 新需求2 新需求3 ...
- 《Essential C++》读书笔记 之 基于对象编程风格
<Essential C++>读书笔记 之 基于对象编程风格 2014-07-13 4.1 如何实现一个class 4.2 什么是Constructors(构造函数)和Destructor ...
随机推荐
- 为什么不在spring容器管理controller
Spring容器与SpringMVC容器 1.疑问:为什么不用spring去管理所有类? 我们配置springMVC 中,为什么controller不直接交给spring 管理而要spring MVC ...
- DOCKER 学习笔记4 认识DockerCompose 多容器编排
前言 通过上一节的学习,学会了如何在Linux 环境下搭建Docker并且部署Springboot 项目,并且成功的跑了起来,当然,在生产环境中,不只是需要一个后端的Web 项目,还需要比如 Ngin ...
- Shell case语法结构解析
case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 ...
- ubuntu19配置静态IP并开启SSH远程登陆
前言 从ubuntu从17.10开始,已经不再在/etc/network/interfaces里配置IP,即使配置了也不会生效,而是改成netplan方式 ,配置写在/etc/netplan/文件夹 ...
- 当你的程序在朋友的机器上显示丢失msvcr100d.dll的时候
0. 给朋友发了个DEMO,收到提示:丢失 msvcr100d.dll 1. 一看是运行库文件,赶紧让朋友下载并安装vc++ 2010 redistribution,朋友反馈还是提示丢失这个dll文件 ...
- Python 中的三元运算(软件测试中运用)
前言 在java中,有类似于 (condition) ? a :b 这样的语法,表示如果condition 为真,返回a,反之返回b.我们称之为三元运算. 那Python中,有没有这样的语法呢,非常遗 ...
- 学习CSS之用CSS绘制一些基本图形
一.三角形 如下图,通过设置 border 的大小和颜色可以形成四个三角形: 上图对应的代码为: /* 三角形 */ .triangle { width: 0; height: 0; ...
- 导弹拦截(dp复习)
题目描述:求最长下降子序列的长度 in: 71 7 3 5 9 4 8 out: 4 解释:1 3 4 8/1 3 5 8 长度为四 这让我想到了hdu上导弹拦截那道题,是求最长上升子序列长度 其转移 ...
- [Python源码剖析]字符缓冲池intern机制
static PyStringObject *characters[UCHAR_MAX + 1]; ... /* This dictionary holds all interned strings. ...
- 程序员过关斩将--redis做消息队列,香吗?
Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...