本文作者为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. python中线程共享资源问题的解决

    线程跟进程有些相似,有时被称作轻量级的进程,但不同的是,所有的线程运行在同一个进程中,共享相同的运行坏境. 进程和线程都是实现多任务的一种方式,例如:在同一台计算机上能同时运行多个QQ(进程),一个Q ...

  2. Asp.Net Core Identity 骚断腿的究极魔改实体类

    前言 默认的 Identity 实体类型在大多数时候已经基本够用,很多时候也只是稍微在 IdentityUser 类中增加一些自定义数据字段,比如头像.这次,我要向园友隆重介绍我魔改之后的 Ident ...

  3. Linux系统资料

    Linux的心得: 1)Linux由众多微内核组成,其源代码完全开源: 2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4. TCP/IPv6和链 ...

  4. Disk:磁盘管理之LVM和系统磁盘扩容

    简介 小伙伴们好,好久不见,今天想给大家介绍一下关于磁盘管理的方法和心得:磁盘管理可谓运维工作中的重要内容,主要包括磁盘的合理规划以及扩缩容 常用的磁盘管理方法为LVM(Logical Volume ...

  5. 通俗易懂的ref和out区别

    ref 和 out 是C#开发中经常用到的两个关键字,但是很多人没有搞清楚这两个关键字的具体区别,下面我们来说一下这两个关键的区别. 零. ref 与 out 的异同 相同: 都是按地址传递: 使用后 ...

  6. c++ 中变量成员的初始化时机

    代码如下: 注意一下我打断点的位置. 最后的结果: 在程序进入MyTest()的函数体之前,控制台就打印出来了I have been constructed. 即:在进入构造函数的函数体之前,类中的成 ...

  7. Yandex Big Data Essentials Week1 Unix Command Line Interface File System exploration

    File System Function In computing, a file system or filesystem is used to control how data is stored ...

  8. Source Code Structure - Python 源码目录结构

    Source Code Structure - Python 源码目录结构 Include 目录包含了 Python 提供的所有头文件, 如果用户需要用 C 或 C++ 编写自定义模块扩展 Pytho ...

  9. Fastjson <=1.2.62 远程代码执行-漏洞复现

    影响范围: Fastjson<=1.2.62 需要开启autotype poc: String text1 = "{\"@type\":\"org.apa ...

  10. docker-enter 安装

    github : https://github.com/sequenceiq/docker-enter [root@localhost ~]# docker run --rm -v /usr/loca ...