文章目录

  • 1 C++中继承的基本概念
    • 1.1 继承的基本概念
    • 1.2 继承的意义
    • 1.3 继承实例分析

1 C++中继承的基本概念

1.1 继承的基本概念

继承关系就是父子关系,UML图如下:

注意是“空心三角箭头”,从子类【派生的类】指向父类【被继承的类】。父类,也称为“基类”。

父亲“派生”出儿子,儿子“继承”自父亲。继承和派生,本质是相同的,只是从不同的角度来描述。

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

  • 子类拥有父类的所有属性和行为。
  • 子类就是一种特殊的父类(子类对象可以直接初始化父类对象,子类对象可以直接赋值给父类对象)。
  • 子类对象可以当作父类对象使用。
  • 子类中可以添加父类没有的方法和属性。

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;
}

1.2 继承的意义

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

1.3 继承实例分析

继承图如下:

代码如下:
Father.h:

#pragma once
#include <string>using namespace std;class Father
{public:Father(const char*name, int age);~Father();string getName();int getAge();string description();private:int age;string name;
};

Father.cpp:

#include "Father.h"
#include <sstream>
#include <iostream>Father::Father(const char*name, int age)
{cout << __FUNCTION__ << endl;this->name = name;this->age = age;
}Father::~Father()
{}string Father::getName() {return name;
}int Father::getAge() {return age;
}string Father::description() {stringstream ret;ret << "name:" << name << " age:" << age; return ret.str();
}

Son.h:

#pragma once
#include "Father.h"class Son : public Father {public:Son(const char *name, int age, const char *game);~Son();string getGame();string description();
private:string game;
};

Son.cpp:

#include "Son.h"
#include <iostream>
#include <sstream>// 创建Son对象时, 会调用构造函数!
// 会先调用父类的构造函数, 用来初始化从父类继承的数据
// 再调用自己的构造函数, 用来初始化自己定义的数据
Son::Son(const char *name, int age, const char *game) : Father(name, age) {cout << __FUNCTION__ << endl;// 没有体现父类的构造函数, 那就会自动调用父类的默认构造函数!!!this->game = game;
}Son::~Son() {}string Son::getGame() {return game;
}string Son::description() {stringstream ret;// 子类的成员函数中, 不能访问从父类继承的private成员ret << "name:" << getName() << " age:" << getAge()<< " game:" << game;return ret.str();
}

main.cpp:

#include <iostream>
#include "Father.h"
#include "Son.h"int main(void) {Father wjl("王健林", 68);Son wsc("王思聪", 32, "电竞");cout << wjl.description() << endl;// 子类对象调用方法时, 先在自己定义的方法中去寻找, 如果有, 就调用自己定义的方法// 如果找不到, 就到父类的方法中去找, 如果有, 就调用父类的这个同名方法// 如果还是找不到, 就是发生错误!cout << wsc.description() << endl;system("pause");return 0;
}

子类, 一般会添加自己的数据成员/成员函数, 或者, 重新定义从父类继承的方法!!! 子类对象就会调用自己重新定义的方法, 不会调用父类的同名方法。


参考资料:

  1. C++深度解析教程
  2. C/C++从入门到精通-高级程序员之路【奇牛学院】

C++中继承的基本概念相关推荐

  1. java 继承 意义_Java中继承,类的高级概念的知识点

    1.继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2.继承的优点 A.代码的可重用性 B.子类可以扩展父 ...

  2. 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法

    目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...

  3. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  4. java中容易混淆的方法_java中容易混淆的概念

    java中容易混淆的概念 1. 谈谈 final, finally, finalize 的区别final-修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不 能作为父类被 ...

  5. Linux中shell变量基础概念笔记

    1.变量的概念 其实shell中的变量是指向系统中一块存储数据的内存空间.变量的形式有局部变量和环境变量两种.并且shell变量属于弱类型的变量,可以不指定变量的类型就可以使用. 2.局部变量 局部变 ...

  6. python的继承用法_python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  7. 面向对象程序设计中“超类”和“子类”概念的来历

    众所周知,在面向对象程序设计中,子类从超类中继承数据成员和成员方法,然后在此基础上再根据实际需要进行扩展并增加属于子类的数据成员和成员方法.也就是说,子类的对象比超类的对象具有更加丰富的属性,或者具有 ...

  8. Java中继承和面向接口的编程

    继承是面向对象中很重要的概念.如果考虑到Java语言特性,继承分为两种:接口继承和实现继承.这只是技术层面的问题,即便C++中不存在接口的概念,但它的虚基类实际上也相当于接口.对于OO的初学者来说,他 ...

  9. python中继承和组合的区别_Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类...

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

最新文章

  1. 浩鲸科技携手阿里云原生共同打造“场域运营数字化解决方案”
  2. 物联网卡linux,Server Develop (六) Linux epoll总结
  3. 内核态和用户态的区别
  4. 发布composer包到 Packagist,并设置自动同步(从github到Packagist)
  5. 远控免杀专题(21)-HERCULES免杀
  6. opencv2 取二进制数据_百亿数据量下,掌握这些Redis技巧你就能Hold全场
  7. Python编程基础15:异常
  8. c语言用栈输出迷宫所有路径,如何在迷宫中使用到栈
  9. OpenCV案例(三): 玉米颗粒计数
  10. SQL中关于where后面不能放聚合函数(如sum等)的解决办法
  11. 数组指针和指针数组的区别(转)
  12. python 自动下载脚本之家,python网页自动化脚本私服过验证
  13. 最近卡脖子的汽车芯片产业链全景图(车规级芯片)
  14. eclipse工具性能优化方法
  15. i310100和i59400f哪个好 i3 10100和i5 9400f差距大吗
  16. C# WinForm中NotifyICon控件的用法
  17. FPGA vs ASIC
  18. 中国舞蹈家协会街舞委员会与微博达成战略合作
  19. 运行vue项目时,如果一直报eslint语法错误的解决方案
  20. 机器学习之线性回归_通过线性回归开始机器学习之旅

热门文章

  1. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第9章-固定翼飞行器的编队跟踪与队形旋转控制
  2. 1.6 开发集和测试集的大小-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  3. Arduino+Max30100心率血氧浓度传感器测试
  4. 【CUDA7.5】MATLAB中配置Win7+Matlab R2015b+CUDA7.5+vs2013配置方法
  5. 深度学习中几种常见的激活函数理解与总结
  6. 什么是OOP(面向对象编程)?
  7. Gartner表示:2017年全球IT支出上升2.7% 中国IT支出达到2.34万亿
  8. 7.7. 其他证书工具
  9. Python基础(list和tuple)可变集合和‘不可变’集合
  10. 探秘Tomcat——一个简易的Servlet容器