本文作者为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. 编译出适合自己的nginx

    上面是解压后的nginx源码 auto目录 上面的cc目录用于编译,lib库 os目录对系统进行判断,其他所有文件都是辅助conf脚本执行 判定nginx支持哪些模块,当前操作系统有哪些特性. CHA ...

  2. SDL多线程显示更新窗口

    //初始化SDL2和创建一个窗口,并且将屏幕绘制成大红色 #include <iostream> extern "C" { #include <SDL.h> ...

  3. gentoo在KVM+QEMU中安装笔记

    gentoo是比较难安装的,本笔记主要是记录本次安装过程,以备参考. 1.首先,下载镜像,可以去国内各大镜像网站下载,我选择的是清华的镜像源:https://mirrors.tuna.tsinghua ...

  4. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  5. vmware14 unlock开启macos选项

    之前搜索了很多资料,用了很多Unlock都失败了,最后重新卸载vmware重新安装后,关闭应用竟然可以了 工具在微信公众号菜菜电脑已保存到百度网盘

  6. ELK搭建(docker环境)

    ELK是Elasticsearch.Logstash.Kibana的简称,这三者是核心套件,但并非全部. Elasticsearch是实时全文搜索和分析引擎,提供搜集.分析.存储数据三大功能:是一套开 ...

  7. ajax实现文本框的联想功能

    先写一个jsp通过ajax传值给servlet进行查询再传给对应的div进行显示. <%@ page language="java" contentType="te ...

  8. 软件bug描述(android)

    1.bug主题:主要操作+bug主题 主题要简单明了,即开发一看主题就知道该问题. 2.描述: 作用:便于开发重现和定位缺陷的 2.1前置条件 2.2操作步骤 2.3预期结果 2.4实际结果 2.5备 ...

  9. JMeter接口测试-JDBC测试

    前言 今天我们一起来学习如何利用JMeter连接数据库进行测试吧! 一:添加线程组,再添加JDBC Connection Configuration(右键测试计划-->配置元件-->JDB ...

  10. 会话技术中的Cookie与session

    关于会话技术 会话:一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:C ...