本文作者为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的更多相关文章

  1. EC读书笔记系列之16:条款35、36、37、38、39、40

    条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...

  2. Essential C++ 学习笔记02--Array/Vector 与指针

    Essential C++ 1.5-1.6节,3.1节笔记 Array/Vector/指针,难度偏大, 但若学习初期不熟悉基本用法,则难以写出有效代码. 1. 基本概念 Array 是一段连续内存,数 ...

  3. Essential C++ 学习笔记01--基本语法

    <Essential C++>1.1-1.4节笔记 1. main 函数 main 函数是代码的入口,若无 main 函数,编译不通过. main 函数通常声明为 int, return ...

  4. Essential C#读书笔记

    Essential C#读书笔记 这是一个多变的时代,一次又一次的浪潮将不同的人推上了巅峰.新的人想搭上这一波,同时老的人也不想死在沙滩上.这些年新的浪潮又一次推开,历史不停地重复上演,那便是移动互联 ...

  5. 《Essential C++》读书笔记 之 目录导航

    <Essential C++>读书笔记 之 目录导航 2014-07-06 第一章:<Essential C++>读书笔记 之 C++编程基础 第二章:<Essentia ...

  6. 《Essential C++》读书笔记 之 C++编程基础

    <Essential C++>读书笔记 之 C++编程基础 2014-07-03 1.1 如何撰写C++程序 头文件 命名空间 1.2 对象的定义与初始化 1.3 撰写表达式 运算符的优先 ...

  7. 《Essential C++》读书笔记 之 面向过程编程风格

    <Essential C++>读书笔记 之 面向过程编程风格 2014-06-18 2.2 调用(invoking)一个函数 2.2.1 Pass by Reference语义 在函数sw ...

  8. 《Essential C++》读书笔记 之 泛型编程风格

    <Essential C++>读书笔记 之 泛型编程风格 2014-07-07 3.1 指针的算术运算(The Arithmetic of Pointer) 新需求1 新需求2 新需求3 ...

  9. 《Essential C++》读书笔记 之 基于对象编程风格

    <Essential C++>读书笔记 之 基于对象编程风格 2014-07-13 4.1 如何实现一个class 4.2 什么是Constructors(构造函数)和Destructor ...

随机推荐

  1. 16、ISDN

    ISDN:综合业务数据网 分类:1.宽带ISDN:基本上被淘汰2.窄带ISDN:用于备份链路,速率比较低 ISDN的起源和优点 ISDN能够提供声音.视频.数据等传输业务 ISDN的两种服务方式ISD ...

  2. # 通过 DockerFile 打包镜像

    在介绍 Docker 具体的操作前,先简要复习下 Docker 的架构,这样可以更好地帮助我们理解 Docker 中的各个命令. 首先我们一直对 Docker 这个叫法就有些误解,Docker 其实指 ...

  3. 【MySQL 原理分析】之 Trace 分析 order by 的索引原理

    一.背景 昨天早上,交流群有一位同学提出了一个问题.看下图: 我不是大佬,而且当时我自己的想法也只是猜测,所以并没有回复那位同学,只是接下来自己做了一个测试验证一下. 他只简单了说了一句话,就是同样的 ...

  4. CCF_ 201509-3_模板生成系统

    又是一道考验细心和耐心的题,不知道哪里出问题了,一直只有90分 = =! #include<cstdio> #include<iostream> #include<cst ...

  5. 题解【Luogu P6102 谔运算】

    \[ \texttt{Description} \] 给出一个长度为 \(n\) 的数列 \(a\),求 \(\sum\limits_{i=1}\limits^{n}\sum\limits_{j=1} ...

  6. Go语言实现:【剑指offer】把字符串转换成整数

    该题目来源于牛客网<剑指offer>专题. 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入描述: 输入一个字符串,包括数字字母符号,可以为空. 输出描述: 如果是合 ...

  7. Coroutine 预激装饰器

    预激装饰器 讨论如何终止协程之前,我们要先谈谈如何启动协程.使用协程之前必须预激,可是这一 步容易忘记.为了避免忘记,可以在协程上使用一个特殊的装饰器.接下来介绍这样一个 装饰器. 预激协程的装饰器, ...

  8. 使用requests、BeautifulSoup、线程池爬取艺龙酒店信息并保存到Excel中

    import requests import time, random, csv from fake_useragent import UserAgent from bs4 import Beauti ...

  9. 在windows系统安装nginx

    1.下载Nginx,链接:http://nginx.org/en/download.html 2.解压放到自己的磁盘,双击击运行nginx.exe,会有命令框一闪而过,在浏览器上面输入localhos ...

  10. nCompass-网络流量基础知识

    nCompass-网络流量基础知识 1.  流量分析基础知识 1.1  常见的流量分析方式: SNMP: 网管平台通过主动式获取设备接口流量信息. Flow:网络设备将穿越的数据流信息精简压缩打包. ...