C++继承详解一 ——继承、继承关系、赋值兼容规则、作用域

【C++】继承详解,菱形继承问题 继承体系概念继承方式赋值兼容规则同名隐藏子类对象的构造过程菱形继承 概念 是面向对象程序设计是代码可以复用的最重要的手段,它允许程序员在保持原有的类的特性的基础下进行拓展,增加功能。 这样产生的类被称为派生类; class Person { public: void Print() { cout << "name:" << _name << endl; cout << "age:" << _age << endl; } protecte 阅读详情

C++是一门面向对象的编程语言(OOP),它有三大特性:封装,继承,多态。
今天我来主要详解一下继承。
一,继承概念:
继承机制(inheritance)是面向对象程序设计中使代码可以复用的最重要手段。他允许程序员在保持原有类特性的基础上进行扩展,增加功能。继承是类之间的关系建模,共享公有的东西,实现各自本质不同的东西。这样产生的类叫做派生类,也叫子类。之前的类叫做基类,也叫父类。
二,继承关系以及继承下的访问限定符
三种类成员访问限定符:public(公有)、private(私有)、protected(保护)。
三种继承关系:public(公有继承)、private(私有继承)、protected(保护继承)。

注:如果继承关系省略,则默认为private继承。

3,继承的定义格式:

单继承:
class <派生类类名>  :<继承方式> <基类类名>
{
    <新定义的类成员>
}

多继承:
class <派生类类名>  :<继承方式> <基类类名>,<继承方式> <基类类名> ...
{
    <新定义的类成员> 
}
class base   //基类(父类)
{
public:
    void fun()
    {}
private :
    int _Bname;
};

//派生类(子类)
class  derive  :public base  //继承关系
{
public:
    void done()
    {}
private:
    int _Dname;
};

四,派生类的构成
派生类的构成有两大部分:自身定义的成员,从基类继承过来的成员。

class base   //基类(父类)
{
public:
    int _Bname;//为了更方便显示结果,我将成员变量定义成共有的。
};

//派生类(子类)
class  derive  :public base  //继承关系
{
public:
    int _Dname;
};

看下图:
这里写图片描述
我们也可以实现一段代码来予以验证

class base   //基类(父类)
{
public:
    int _Bname;//为了更方便显示结果,我将成员变量定义成共有的。
};

//派生类(子类)
class  derive  :public base  //继承关系
{
public:
    int _Dname;
};

int main()
{
    base b1;
    b1._Bname = 1;
    derive d1;
    d1._Dname = 2;
    d1._Bname = 3;
    system("pause");
    return 0;
}

这里写图片描述

从代码中可以看出,对象d1可以对_Bname进行赋值,图片中也很好地展现了出来。这说明成员 _Bname以是d1的构成一部分了。
五,三种继承关系
public继承:
在平时实践的例子中,大多数都属于公有继承。公有继承中,基类的公有成员和保护成员在派生类中维持自己的访问属性,其私有成员为不可见,也就是说派生类不能访问基类的私有成员。私有成员体现了封装性,如果基类的私有成员被派生类访问,则破坏了基类的封装性。
基类的私有成员不能被派生类访问的。如果你想看看基类的私有成员有哪些,你只需在基类中定义一个非私有的成员函数Show()即可。

class base   //基类(父类)
{
public:
    void Show()
    {
        cout << _Bname << endl;
    }
private:
    int _Bname;
};

公有继承是一个接口继承,保持 is-a 原则,每个父类可访问的成员对子类也可访问。因为每个子类对象都是一个父类对象。
private继承:
私有继承中,基类的公有成员和保护成员都会变成私有成员,而私有成员则是不可见的。私有继承和保护继承是一种实现继承,基类的部分成员并未完全成为子类接口的一部分,是 has-a 的关系原则。
protected继承:
保护继承是一种实现继承,基类的部分成员并未完全成为子类接口的一部分,是 has-a 的关系原则。所以如果你不想基类有的成员被派生类访问,但是需要在基类中访问,你就将该成员设为保护成员。这就看出保护成员限定符是因为继承才出现的。

注:使用关键字class时默认的继承方式是private,使用struct是默认的继承方式是public,不过最好标注出来。

六,继承与转换 (在public继承的基础上)
1,子类对象可以赋值给父类对象(切片/切割);
2,父类对象不能赋值给子类对象;
3,子类对象可以赋值给父类的指针/引用,即父类的指针/引用可以指向子类对象。
4,子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)。

上面四点我们来通过图和代码的方式来详解:

这里写图片描述

class base   //基类(父类)
{
public:
    base()
        :_Bname(1)
    {}
    void Show()
    {
        cout << _Bname << endl;
    }
private:
    int _Bname;
};

//派生类(子类)
class  derive  :public base  //继承关系
{
public:
    derive()
        :_Dname(2)
    {}
    int _Dname;
};

void Test()
{
    base b;
    derive d;

    //1,关于赋值

    //b = d;   //子类可以赋值给父类(切片/切割)
    //d = b;     //父类不可赋值给子类。没有找到接收“base”类型的右操作数的运算符

    //2,关于引用/指针

    base* p1 = &d;   //父类指针/引用可以指向子类对象
    base& r1 = d;

    derive* p2 = (derive*)&b;  //可以通过强转实现
    derive& r2 = (derive&)b;

    //如果这样,则会发生什么?
    p2->_Dname = 10;  //发生错误,原因是指针p2强转类型后指向父类,但是父类不存在后四个字节内容,即不存在_Dname;
    r2._Dname = 20;   //错误,原因同上

    b.Show();
    d.Show();
}

int main()
{
    Test();
    system("pause");
    return 0;
}

七,继承体系中的作用域
1,基类和派生类都有自己独立的作用域。
2,子类和父类中有同名成员,子类成员将屏蔽父类对成员的直接访问(在子类成员函数中,可以使用 基类 ::基类成员 访问)。这叫隐藏,后面的文章我会详细讲解。

class base
{
public:
    base(const char* name = "",int id = 0)
        :_name(name),_num(id)
    {}
protected:
    string _name;   //姓名
    int _num;     //身份证号   与子类_num成员同名
};
class derive  :public base
{
public:
    derive(const char* name,int id,int num)
        :base(name,id),_num(num)
    {}

    void Display()
    {
        cout << "身份证号:" << base::_num << endl;  //通过作用域解析符来指定
        cout << "学号:" << _num << endl;
    }
protected:
    int _num;   //学号   与父类_num成员同名
};
void Test()
{
    derive d("paul",110,1);
    d.Display();
}
int main()
{
    Test();
    system("pause");
    return 0;
}
C++继承详解(一):继承基础、访问限定和赋值兼容规则的理解 继承的基本概念 、单继承 、多继承 、C++继承的访问限定 、友元函数、静态成员函数的继承 、赋值兼容性规则 阅读详情

相关推荐

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解)

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解) 大家好,我是菌菌巧乐兹,励志用最简单的语言来讲解程序知识点。

菌菌兹的博客 1669

面向对象语言:继承关系教程

面向对象语言:继承关系详解 C#:继承 本文提供全流程,中文翻译。 Chinar 助力理解 C# 语法中 类 的继承关系为新手节省宝贵的时间,避免采坑! C# —— 面向对象编程的三大特性:封装、继承、多态 这里我们来详细说说: 继承 通过简单的例子,来说明继承关系

Chinar优快云的博客 830

西门子Simotion运动控制

SIMOTION

rjimhcd的博客 3024

c++继承详解之一——继承的三种方式、派生类的对象模型

C++是OOP(Object Oriented Programming)语言,即面向对象编程语言。OOP的核心思想就是数据抽象(类的设计),继承和动态绑定。 类展现了C++的封装特性,即将具体的实现过程隐藏,只向外暴露公有接口,即数据抽象,通过数据抽象,我们可以将类的接口与实现分离,(即设计类)。 与C相比,类可以通过相互间的继承和派生形成层次结构,派生类继承了基类的数据结构和方法 [编译时]。 使

lixungogogo的博客 3万+

DP链路训练从HPD触发到通道对齐:原理与调试实战

高速数字接口的稳定工作依赖物理层信号的精确协商,链路训练正是DisplayPort接口中确保源端与接收端在速率、摆幅和时序上达成一致的关键机制。HPD作为链路状态变化的触发信号,与通道对齐一同构成了训练流程的首尾环节。理解从时钟恢复到均衡再到多通道对齐的完整过程,有助于快速定位显示异常问题。在工程实践中,借助DPCD寄存器交互和AUX通道日志,可以系统性地排查训练失败原因。围绕链路训练全流程进行剖析,重点探讨HPD触发机制、训练图案选择、寄存器配置以及链路降级策略,为显示方案开发与调试提供工程参考。

weixin_30110543的博客 234

Crossbar RRAM技术解析:从1TnR架构到存储革命

非易失性存储器(NVM)是数据存储的核心技术,其原理基于物理状态的稳定改变以实现数据持久化。阻变存储器(RRAM)作为一种新兴NVM,利用导电细丝在介质层中的形成与断裂实现数据存储,具有高速、低功耗和结构简单的优势。在工程实践中,RRAM面临潜行路径电流等挑战,而Crossbar提出的1TnR架构通过引入共享晶体管有效解决了这一问题,在保证性能的同时提升了集成密度。该技术与CMOS工艺兼容,支持后端集成与多层堆叠,为高密度存储和嵌入式应用提供了新的解决方案。结合当前行业对高能效、高密度存储的需求,RRAM在

weixin_42523104的博客 320

继承

得到钱的最快的方式是什么?答曰:继承!这个网络段子程序员都听过,今天就来学习一下c++中的继承。 什么是继承?        C++中继承的概念:继承机制是面向对象程序设计使代码可以复用的最重要的手段,他允许程序员在保持原有类的基础之上进行扩展,增强其功能。这样产生新的类称为派生类或子类,被继承的类称为基类或父类。 继承的定义格式:        与类成员的访问类型相似,继承可分为publ

xuzhangze的博客 497

从零构建2.4G无线通信系统:MSPM0G3507与NRF24L01的深度协同设计

本文详细介绍了基于MSPM0G3507微控制器与NRF24L01射频模块构建2.4G无线通信系统的深度协同设计方案。内容涵盖系统架构、SPI通信优化、功耗管理、抗干扰机制及中断/DMA高效利用,为工业物联网应用提供高可靠、低功耗的无线传输解决方案。

rice5的博客 821

Java继承关系(超详细)

在 Java 中,继承是面向对象编程的一个重要特性。继承允许一个类(称为子类或派生类)获取另一个类(称为父类或基类)的属性和方法。通过继承,子类可以复用父类的代码,并且可以在父类的基础上添加新的属性和方法,或者修改父类的方法实现(方法重写),继承使用extends关键字来实现。例如:这个代码就表示了cat类继承了animal类。

shajjs的博客 1663

别再让信号‘撞墙’了!手把手教你用嘉立创阻抗计算器搞定PCB高速线(附免费压层结构选择)

本文详细介绍了如何使用嘉立创阻抗计算器解决PCB高速线设计中的阻抗匹配问题,避免信号反射和传输损耗。通过免费压层结构选择和五步计算法,帮助工程师快速掌握USB3.0差分线等高速信号的设计技巧,提升PCB设计效率和信号质量。

weixin_30736301的博客 279

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

努力,加油每一天鸭~ 825

C++之继承关系(易懂篇)

C++之继承关系(易懂篇) 继承概述:

Goalin0的博客 748

如何正确理解和获取S参数

差分四端口的S参数是由双端口S参数逐步演化而来,因此,在数学中,其各分量均可以从单端S参数推导而来,在实际的仿真和测试中,软件和测量设备也是通过获取单端S参数矩阵再进行运算得到混合S参数矩阵的,并非直接获取。

一只豌豆象的博客 5151

C++ 对象间的继承关系(赋值兼容规则)

C++ 通过类派生 的机制来支持继承。被继承的类称为基类 ,新产生的类为派生类 或子类,基类和派生类的集合 称作类继承层次结构。

qq_63282188的博客 2178

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++修炼之路之继承<一>隐藏,赋值转换规则,继承关系

面向对象的三大特性为封装,继承和多态,对于封装在类与对象中介绍过,它其实就是通过封装底层的复杂实现机制,给我们展现出一个简单快捷方便的使用方式,如迭代器的使用,接下来我们将介绍第二大特性:继承

Miwll的博客 937

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)

继承(inheritance)是面向对象编程当中实现代码复用最重要的手段。继承允许我们在原有的类的基础之上进行扩展,创建一个新的类(叫做子类或派生类),该类可以继承原有类(叫做父类或基类)的属性和方法。继承体现了面向对象编程的层次结构--从简单到复杂的过程。

2301_80955819的博客 1749

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【C++深度探索】:继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数)

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或子类)。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected://名字//年龄protected:int _stuid;// 学号protected:int _jobid;// 工号。

island1314的博客 1561

C++继承,万字笔记简单易懂

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类(基类)特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。在继承之前一般都是函数的复用,而继承是类层次的复用。

weixin_46016019的博客 6707

【C++ | 继承】|概念、方式、特性、作用域、6类默认函数

继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。在软件开发过程中,我们经常会遇到需要为多个类添加相同的行为或属性的场景,这样就产生了代码重复的问题。为了解决这个问题,工程师们开始寻找一种方法来实现代码的复用。继承就是一种解决代码复用问题的方式。它允许我们创建一个新的类,继承自一个已经存在的类,从而继承和复用父类的属性和方法。通过继承,我们可以在不改变父类的前提下,为子类添加额外的属性和方法,实现功能的扩展。继承方式的由来可以追溯到早期的面向对象编程语言。

shijiaqingsnfx的博客 2153

【C++】继承(一)继承三部曲:概念、转换、作用域一网打尽

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。简单来说就是子类继承父类后,可以使用父类的成员或者函数(前提是访问权限足够,这个我们后面讲)父类(基类):父类是一个更一般、更抽象的类,它定义了一组属性和方法,这些属性和方法会被其子类所继承。

2201_76005883的博客 1034

C++之继承

不破不立!

X_do_myself的博客 1448

【C++进阶】C++ 继承家族史,也就那么回事儿

C++继承详解

小羊的博客 2307

C++中的继承

继承:是面向对象程序设计中使代码可以复用的重要手段,它允许程序员在原有类特性的基础上进行扩展增加功能。这样产生的新的类叫派生类。 继承体现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。 格式 class DerivedClassName : access_label BaseClassName 派生类名字 : 继承权限 父类名字 继承关...

咚咚东拉的博客 1万+

C++继承机制详解(单继承,多继承,菱形继承,虚继承)

继承的核心是代码的复用,继承机制就是面向对象语言对于类保持原来的结构,并对其进行扩展的重要手段。在继承里有这样两个类,基类(父类),派生类(子类)。继承就是子类继承父类,子类的结构相当于是在父类的结构上面的一个扩展。继承是类在设计层次的复用。继承可以说是C++语法复杂的一个方面,因为有了多继承,所以就会存在菱形继承,为了解决菱形继承又有了菱形虚拟继承。不仅底层实现复杂,对性能也有影响。所以一般不能设计出菱形继承。大多数情况都是使用单继承。像是java只有单继承。

qq_62745420的博客 1798

C/C++相关概念和易错知识点(40)(赋值兼容转换、多继承、继承与组合)

而一般来讲,protected成员更倾向于类功能的底层,函数更多,父类的书写者不可能去考虑子类调用的情况来适配,这对于书写子类功能的人来说无疑是一场灾难。,我们只能调用该类向外展示的函数接口,其余细节完全不知道,因此如果这个类出现了毛病,有人去维护,它们只需要修bug就行了,只需要保证对外提供的接口是安全的,功能是正常的就可以了。我们会发现,BCD都没有问题,但E就有问题了,E通过两条继承关系链继承了两次A,意味着E里面有两份A的成员变量,这是单继承永远碰不到的情况,这叫。这是子类给父类赋值的一种操作。

SGlow0708的博客 1699

c++——继承

C++继承的介绍

2301_79310249的博客 2760
上一篇: 冒泡排序的三种实现
下一篇: Linux下简单进度条的实现
pg_dog
博客等级 码龄10年 19粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值