C++图文并茂讲解继承

目录
  • 一、生活中的例子
  • 二、惊艳的继承
  • 三、继承的意义
  • 四、小结

一、生活中的例子

组合关系∶整体与部分的关系

下面看一个组合关系的描述代码:

#include <iostream>
#include <string>
using namespace std;
class Memory
{
public:
    Memory()
    {
        cout << "Memory()" << endl;
    }
    ~Memory()
    {
        cout << "~Memory()" << endl;
    }
};
class Disk
{
public:
    Disk()
    {
        cout << "Disk()" << endl;
    }
    ~Disk()
    {
        cout << "~Disk()" << endl;
    }
};
class CPU
{
public:
    CPU()
    {
        cout << "CPU()" << endl;
    }
    ~CPU()
    {
        cout << "~CPU()" << endl;
    }
};
class MainBoard
{
public:
    MainBoard()
    {
        cout << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }
};
class Computer
{
    Memory mMem;
    Disk mDisk;
    CPU mCPU;
    MainBoard mMainBoard;
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    void power()
    {
        cout << "power()" << endl;
    }
    void reset()
    {
        cout << "reset()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
};
int main()
{
    Computer c;
    return 0;
}

输出结果如下:

组合关系的特点

  • 将其它类的对象作为当前类的成员使用
  • 当前类的对象与成员对象的生命期相同
  • 成员对象在用法上与普通对象完全一致

继承关系∶父子关系

二、惊艳的继承

面向对象中的继承指类之间的父子关系

  • 子类拥有父类的所有属性和行为
  • 子类就是一种特殊的父类
  • 子类对象可以当作父类对象使用
  • 子类中可以添加父类没有的方法和属性

C++ 中通过下面的方式描述继承关系

下面就来进行继承的初体验:

#include <iostream>
#include <string>
using namespace std;
class Parent
{
    int mv;
public:
    Parent()
    {
        cout << "Parent()" << endl;
        mv = 100;
    }
    void method()
    {
        cout << "mv = " << mv << endl;
    }
};
class Child : public Parent
{
public:
    void hello()
    {
        cout << "I'm Child calss!" << endl;
    }
};
int main()
{
    Child c;
    c.hello();
    c.method();
    return 0;
}

输出结果如下:

重要规则:

  • 子类就是一个特殊的父类
  • 子类对象可以直接初始化父类对象
  • 子类对象可以直接赋值给父类对象

三、继承的意义

继承是 C++ 中代码复用的重要手段。通过继承,可以获得父类的所有功能,并且可以在子类中重写已有功能,或者添加新功能。

下面再来看一个继承的代码:

#include <iostream>
#include <string>
using namespace std;
class Memory
{
public:
    Memory()
    {
        cout << "Memory()" << endl;
    }
    ~Memory()
    {
        cout << "~Memory()" << endl;
    }
};
class Disk
{
public:
    Disk()
    {
        cout << "Disk()" << endl;
    }
    ~Disk()
    {
        cout << "~Disk()" << endl;
    }
};
class CPU
{
public:
    CPU()
    {
        cout << "CPU()" << endl;
    }
    ~CPU()
    {
        cout << "~CPU()" << endl;
    }
};
class MainBoard
{
public:
    MainBoard()
    {
        cout << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }
};
class Computer
{
    Memory mMem;
    Disk mDisk;
    CPU mCPU;
    MainBoard mMainBoard;
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    void power()
    {
        cout << "power()" << endl;
    }
    void reset()
    {
        cout << "reset()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
};
class HPBook : public Computer
{
    string mOS;
public:
    HPBook()
    {
        mOS = "Windows 8";
    }
    void install(string os)
    {
        mOS = os;
    }
    void OS()
    {
        cout << mOS << endl;
    }
};
class MacBook : public Computer
{
public:
    void OS()
    {
        cout << "Mac OS" << endl;
    }
};
int main()
{
    HPBook hp;
    hp.power();
    hp.install("Ubuntu 16.04 LTS");
    hp.OS();
    cout << endl;
    MacBook mac;
    mac.OS();
    return 0;
}

输出结果如下:

四、小结

  • 继承是面向对象中类之间的一种关系
  • 子类拥有父类的所有属性和行为
  • 子类对象可以当作父类对象使用
  • 子类中可以添加父类没有的方法和属性
  • 继承是面向对象中代码复用的重要手段

到此这篇关于C++图文并茂讲解继承的文章就介绍到这了,更多相关C++继承内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 超详细梳理继承的概念与使用

    目录 继承的概念及定义 继承的概念 继承定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 菱形继承 虚拟继承解决数据冗余和二义性的原理 继承的总结和反思 继承的概念及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体

  • C++类继承时的构造函数

    前言: 子类需要编写自己的构造函数和析构函数,需要注意的是,子类只负责对新增的成员进行初始化和扫尾编写构造和析构函数,父类成员的初始化和扫尾工作由父类的构造函数和析构函数完成. 无论何种类型的继承方式,子类都无权访问父类的所有成员,所以子类对父类的初始化需要父类的构造函数完成.此时,子类的构造函数必须提供父类构造函数所需的参数. 子类构造函数的语法如下: 子类::子类(全部参数表):父类1(父类1参数表),父类2(父类2参数表)      ...对象成员1(对象成员1参数表),对象成员2(对象成

  • C++类的继承和派生及指针安全引用

    目录 一.继承和paisheng 1.继承和派生的基础概念 2.如何定义子类 3.吸收和改造父类成员.添加新成员 二.指针引用 1.指针和引用的异同 2.指针的安全隐患 一.继承和paisheng 1.继承和派生的基础概念 继承指从现有类获得其特性,派生指从已有类产生新的类.原有的类称为基类或父类,新生的类称为子类或派生类.当子类只有一个父类时称为单继承,当子类含有多个父类时称为多继承.如果基类A直接参与了派生类B的派生过程,那么A类称为直接基类:基类的基类称为间接基类. 2.如何定义子类 定义

  • 详解C++中单继承与多继承的使用

    目录 前言 1.继承的概念和定义 (1)继承的概念 (2)继承的定义方法 (2)继承后子类的成员类型 2.基类与派生类的赋值转换 (1)派生类赋值给基类 (2)基类给派生类 3.继承中的作用域 (1)隐藏的概念 (2)例题 4.派生类的默认成员函数 (1)默认生成的成员函数 (2)自己写 5.友元与静态成员 6.多继承 (1)概念 (2)复杂的菱形继承 (3)虚继承解决菱形继承问题 (4)虚继承的原理 7.继承与组合 (1)两者区别 (2)继承与组合的区别 (3)使用情况 8.总结 前言 C++

  • C++深入探究继承的概念与使用

    目录 1.概念及定义 1.1 概念 1.2 定义 2.class与struct的区别 3.赋值兼容规则 4.继承中的作用域问题 5.派生类(子类)的默认成员函数 5.1 构造函数 5.2 拷贝构造函数 5.3 赋值运算符重载 5.4 析构函数 6.基类中哪些成员被子类继承了 6.1 成员变量 6.2 成员方法 7.友元函数被继承了吗 1.概念及定义 1.1 概念 继承主要的工作就是-----共性抽取 具体地讲: ①继承机制是面向对象程序设计使代码可以复用的最重要的手段; ②允许程序员在保持原有类

  • C++ 多继承详情介绍

    C++支持多继承,即允许一个类同时继承多个类. 关于多继承,一直以来争议不断,有一部分人认为多继承会带来大量的问题,为了解决这些问题会使得语言本身变得非常复杂,因此应当避免.另外一派认为多继承在某些场景下可以起到非常关键的作用,应当予以支持. 关于多重继承是好是坏,这是一个非常复杂的问题,网上历来争议不断.因此不过多阐述,感兴趣的同学可以查阅一下相关资料.仅仅从实际支持来看,目前市面上大部分的语言包括Java仅支持单继承,只有C++等少数语言支持多继承.这和C++的理念也有关,即认定不能通过减少

  • C++详细讲解继承与虚继承实现

    目录 继承的概念及定义 概念: 定义: 继承关系和访问限定符 总结 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 虚继承原理 继承的总结 继承的概念及定义 概念: 继承机制是面向对象程序设计为了提高代码复用率的一种手段,它可以保持原类特性的基础上进行拓展,简单来说继承是类层次的复用. 接下来我们来看一个简单的继承 class Person { public: void Print() { cout<<"nam

  • C++的继承特性你了解吗

    目录 导语: 继承作用 继承的结果 继承方式 子类构造 赋值兼容规则/向上转换/内存切片 多继承 虚拟继承 总结 导语: C++是对C语言的优化和改进,C++之所以优秀的点在于它的特性:抽象.封装.继承和多态. 本章总结继承的规则和特性,都是干货,与读者共同学习. 继承作用 代码的复用 子类继承父类,可以理解为,将父类的代码拷贝一份到子类中,达到子类可以调用父类方法的目的. 那为什么是可以理解而不是就是呢? 是因为有几个东西是不可以拷贝的,比如,父类的拷贝和析构方法,友元和静态成员. 友元关系是

  • C++深入探究不同的继承体系

    目录 单继承 多继承 菱形继承 概念 存在的问题 解决方案 菱形虚拟继承 虚拟继承 什么是虚拟继承 内存层面理解虚拟继承 虚拟继承和普通单继承的区别 虚拟继承+菱形继承 声明: 本文的测试环境为Windows平台下的VS2013环境 单继承 一个子类只有一个父类.这类继承方式是最为简单的.具体可以参考继承 上篇中的例子.这里给出简单的图示即可: 多继承 一个子类有两个或两个以上的直接父类,这样的继承关系称之为多继承. 图解: 注意事项:  ①在多继承的场景下,建议在继承的每一个基类名称前都加上继

  • C++图文并茂讲解继承

    目录 一.生活中的例子 二.惊艳的继承 三.继承的意义 四.小结 一.生活中的例子 组合关系∶整体与部分的关系 下面看一个组合关系的描述代码: #include <iostream> #include <string> using namespace std; class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory() { cout <<

  • Kotlin图文并茂讲解续体与续体拦截器和调度器

    目录 一.Continuation 二.ContinuationInterceptor 三.CoroutineDispatcher 四.EventLoop 一.Continuation Continuation接口是协程中最核心的接口,代表着挂起点之后的续体,代码如下: public interface Continuation<in T> { // 续体的上下文 public val context: CoroutineContext // 该方法用于恢复续体的执行 // result为挂起

  • Java 图文并茂讲解两种找二叉树的最近公共祖先的方法

    目录 思路一:先假设这棵树是二叉搜索树 思路二:假设该树是用孩子双亲表示法 思路一:先假设这棵树是二叉搜索树 首先我们补充说明一下什么是二叉搜索树: 在二叉搜索树中,对于每一个节点来说,他的左子树中的值都比他小,右子树的中的值都比他大.所以二叉搜索树的中序遍历是一组有序的数据. 对于上述这棵树,假设要求 p q 的最近公共祖先. 那么它有以下情况: 对于普通的二叉树来说,也无非就这几种情况:pq都在左,pq都在右,pq一左一右,pq有一个是根节点. 所以分别递归的去左子树和右子树中找 p q 节

  • C语言图文并茂讲解分支语句用法

    目录 一.if 语句分析 二.switch 语句分析 三.小结 一.if 语句分析 if 语句用于根据条件选择执行语句 else 不能独立存在且总是与它最近的 if 相匹配 else 语句后可以接连其他 if 语句 if 语句中零值比较的注意点 bool 型变量应该直接出现于条件中,不要进行比较 变量和 0 值比较时,0 值应该出现在比较符号左边(这条规则可以拓展为任意字面量与变量比较时,字面量应该放在左边,变量放在右边,这样即使手误写成了 = ,编译器也能发现) float 型变量不能直接进行

  • Java由浅入深讲解继承下

    目录 1.代码块初始化 2.protected关键字 3.final关键字 4.Java中允许的继承方式 本篇紧接上一篇内容继续,还是从继承里的细节开始 1.代码块初始化 关于代码块的定义和使用因为之前已经进行过介绍,所以这里就不再赘述,我们所关注的点是父类和子类中的代码块在运行时候的先后顺序是怎样的 首先还是在父类以及子类中添加代码块,如下: //父类 { System.out.println("父类实例代码块"); } static { System.out.println(&qu

  • Java由浅入深讲解继承上

    目录 1.什么是继承 2.继承的细节 2.1super关键字 2.2子类的构造方法 2.3super和this区别 继承同样是面向对象程序的特点 1.什么是继承 所谓继承就是抽取类的共性,进而实现代码的复用 继承的关键字是extends 现在定义一个类Tree,里面有树的名字.来源和科属,方法是打印树的形态特征,如下: class Tree { String name; String source; String genu; public void trait() { } } 上面的类除了方法t

  • C++图文并茂讲解类型转换函数

    目录 一.类型转换函数(上) 1.再论类型转换 2.问题 3.再论构造函数 4.另一个视角 5.编译器的行为 6.小结(上) 二.类型转换函数(下) 1.类型转换 2.编译器的行为 3.注意事项 4.小结(下) 一.类型转换函数(上) 1.再论类型转换 标准数据类型之间会进行隐式的类型安全转换 转换规则如下: 下面来看一个有趣的隐式类型转换: #include <iostream> #include <string> using namespace std; int main()

  • SpringBoot图文并茂讲解依赖管理的特性

    目录 1.父依赖parent介绍 2.修改默认版本号 3.starter场景启动器 1.父依赖parent介绍 pom文件中含有父依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </pa

  • SpringBoot图文并茂讲解登录拦截器

    目录 1.相关概念 1.实现效果 2.实现步骤 2.代码实现 1.配置文件 2.java代码 3.前端代码 3.运行测试 1.相关概念 1.实现效果 当没有输入正确的账号密码登录成功时, 除了登录页,其他页面都无法访问(静态资源要放行) 2.实现步骤 编写一个拦截器实现HandlerInterceptor接口 拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors()) 指定拦截规则(注意,如果是拦截所有,静态资源也会被拦截) 2.代码实现 1.配置文件 pom

随机推荐