【C++ 进阶】继承

这篇具有很好参考价值的文章主要介绍了【C++ 进阶】继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.继承的定义格式

【C++ 进阶】继承,C++进阶,c++,开发语言,继承

基类又叫父类,派生类又叫子类;


二.继承方式

继承方式分为三种:

     1.public继承

     2.protected继承

     3.private继承

【C++ 进阶】继承,C++进阶,c++,开发语言,继承

基类成员与继承方式的关系共有9种,见下表:

 虽然说是有9种,但其实最常用的还是红框里的,其它的很少用。

【C++ 进阶】继承,C++进阶,c++,开发语言,继承

 总结

1. 基类private成员在派生类中无论以什么方式继承都是不可见的

    不可见指:基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不       管在类里面还是类外面都不能去访问它;

2.如果想要在派生类访问基类中的成员变量,可以在基类中定义为 protected 成员

3.基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式)

4.使用关键字class时默认的继承方式是private

   使用struct时默认的继承方式是public


三.派生类和基类之间的赋值转换

【C++ 进阶】继承,C++进阶,c++,开发语言,继承

 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用,这个过程又被形象的称为      切片/切割

2.基类对象不能赋值给派生类对象

3.基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的;


四.隐藏(重定义)

1.子类和父类中,只要函数名相同就构成隐藏

2.成员名相同也构成隐藏;

3.在子类成员函数中,可以使用 基类::基类成员 显示访问隐藏的函数或成员;

4.最好不要定义同名的成员变量。

隐藏(重定义)与重载

重载:在同一作用域

隐藏:在不同的作用域,一个在父类,一个在子类


五.派生类中的默认成员函数

1.构造函数

   派生类必须先自动调用基类的默认构造(初始化基类的那一部分成员),如果基类没有默     认构造,就要在派生类的初始化列表阶段显式调用基类的构造函数,然后派生类调用自己     的构造函数。

2.拷贝构造

   派生类的拷贝构造必须先调用基类的拷贝构造完成基类的拷贝初始化。

3.赋值重载

   派生类赋值重载必须先调用基类的赋值重载完成基类的复制。

4.析构函数

   销毁对象时,会先调用派生类的析构函数,然后再自动调用基类的析构函数,这样就保证     了析构的顺序(即先子后父)

   如果不是这个顺序,一个成员可能会析构两次,就会导致程序崩溃,比如以下的代码:

class A
{
public:
	~A()
	{
		delete _a;
	}

	int* _a = new int;
};

class B :public A
{
public:
	~B()
	{
		delete _b;  
		A::~A();   //显式调用父类的析构函数,在调用完后,编译器又会自动调用一次父类的析构函数, 
                   //导致父类成员_a析构了两次,从而程序崩溃
	}

	int* _b = new int;
};

int main()
{
	A  a;
	B b;
	return 0;
}

六.继承与友元,静态成员

 友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员;

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子
类,都只有一个static成员实例 ,静态成员不属于任何一个具体的实例对象,而是属于类本身,子类可以继承父类的静态成员,而不需要重新定义。


七.多继承

多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承

下面就是一个多继承:

class A
{};

class B
{};

class C:public A,public B   //多个父类之间用逗号隔开
{};

多继承的一个坑:菱形继承

【C++ 进阶】继承,C++进阶,c++,开发语言,继承

 上图就构成了一个菱形继承,它会导致两个问题:

   1.数据冗余,因为会存两个Person类;

   2.二义性

class A
{
public:
	int _a;
};

class B :public A
{
public:
	int _b;
};

class C :public A
{
public:
	int _c;
};

class D :public B, public C
{
public:
	int _d;
};

int main()
{
	D d;
	d._a;   //二义性问题,不知道访问的是哪个_a;
    d.A::_a;   //显式访问,解决了二义性问题,但无法解决数据冗余问题

	return 0;
}

虚拟继承:解决菱形继承问题

在菱形继承的腰部加上 virtual  关键字构成虚拟继承

如将上面代码class B 和  class C  改成:

class B: virtual public A   //虚拟继承
{};

class C: virtual public A
{};

原理

通过观察菱形继承和虚拟继承的内存窗口我们发现:

【C++ 进阶】继承,C++进阶,c++,开发语言,继承

 【C++ 进阶】继承,C++进阶,c++,开发语言,继承

 


八.总结和反思

1.public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象

2.组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象

例如:

class A
{};

class B
{
    A a;   //组合
};

3.组合的耦合性比继承低,所以一般推荐使用组合。


🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼文章来源地址https://www.toymoban.com/news/detail-606966.html

到了这里,关于【C++ 进阶】继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++进阶之路】第一篇:C++中的继承

    🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【C++学习与应用】 ✒️✒️本篇内容:继承的基础概念,定义方法,基类和派生类的转换,继承中类的作用域,什么是隐藏,派生类和默认成员函数,继承和友元,继承与静态函数,菱形继承和虚拟继承,菱形继承总结

    2024年02月02日
    浏览(39)
  • 【C++进阶】继承、多态的详解(多态篇)

    作者:爱写代码的刚子 时间:2023.8.16 前言:本篇博客主要介绍C++中多态有关的知识,是C++中的一大难点,刚子将带你深入C++多态的知识。(该博客涉及到的代码是在x86的环境下,如果是在x86_64环境下指针的大小可能需要变成8bytes) 多态的概念 多态的概念:通俗来说,就是多

    2024年02月12日
    浏览(40)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(74)
  • C++类开发的第六篇(虚拟继承实现原理和cl命令的使用的bug修复)

    接上一篇末尾虚拟继承的简单介绍之后,这篇来详细讲一下这个内存大小是怎么分配的。 cl 是 Microsoft Visual Studio 中的 C/C++ 编译器命令。通过在命令行中键入 cl 命令,可以调用 Visual Studio 的编译器进行编译操作。 cl 命令提供了各种选项和参数,用于指定源文件、编译选项、

    2024年03月09日
    浏览(45)
  • C++语言程序设计之类和对象进阶(3)

            这一部分介绍C++友元函数、友元类和this指针。         友元函数,可以在类的成员函数外部直接访问对象的私有成员。 1.1.1 设计代码 1.1.2 执行结果 图1 友元函数代码执行结果

    2024年01月25日
    浏览(43)
  • 【C++ 进阶】第 1 章:[C 语言基础] C 语言概述与数据类型

    目录 一、C 语言的概述  (1)计算机结构组成 (2)计算机系统组成  (3)ASCII 码 (4)计算机中的数制及其转换 (5)程序与指令  (6)语言的层次划分 (7)主流语言进化史 (8)IDE - VisualStudio 2022 简介 (9)C 语言是面向过程的编程语言 (10)思维导图 (11)详细知识汇

    2024年02月15日
    浏览(42)
  • 【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

    author:Carlton tag:C++ topic:【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息 website:黑马程序员C++ date:2023年7月22日 目录 概要 继承规则 对象模型 构造析构顺序 同名与静态同名成员 多继承 菱形继承 VS开发人

    2024年02月16日
    浏览(51)
  • Maven进阶系列-继承和聚合

    Maven工程之间存在继承关系,例如工程B继承工程A,工程C也继承了工程A ProjectA的pom.xml ProjectB的pom.xml ProjectC的pom.xml 本质上是ProjectB和ProjectC的 pom.xml 中的配置 继承了ProjectA中 pom.xml 的配置。 这里提到了 超级pom.xml ,对于我们创建的一个maven工程,即便我们自己的pom.xm文件中没

    2024年02月07日
    浏览(40)
  • 黑马Java——面向对象进阶(static&继承)

    目录 1.static静态变量 练习1:定义数组工具类 练习2:定义学生工具类 2.继承  练习:继承的练习(自己设计一个继承体系) 练习 利用方法的重写设计继承结构 练习:带有继承结构的标准Javabean类 3.多态   多态的综合练习 4.包和final 4.1包 4.2final  5.权限修饰符和代码块 5.1权

    2024年01月25日
    浏览(41)
  • 【Python】【进阶篇】30、Django模板继承精讲

    在本节我们讲述模板语言中最后一个知识点,也是最重要的,那就是模板继承。模板继承和 Python 语言中类的继承含义是一样的,在 Django 中模板只是一个文本文件,如 HTML,XML,CSV等文件格式。那模板继承到底是是什么呢?如何在 Django 中使用它呢?让我们一起一探究竟。 模

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包