当前位置: 首页 > wzjs >正文

阿里巴巴专门做外贸的网站淮北矿业工程建设有限公司网站

阿里巴巴专门做外贸的网站,淮北矿业工程建设有限公司网站,深圳市住房和建设局投诉电话,中国执行信息公开网查询目录 前言 一、继承的概念及定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 (一)单继承与多继承 (二)菱形继承 …

目录

前言

一、继承的概念及定义

二、基类和派生类对象赋值转换

三、继承中的作用域

四、派生类的默认成员函数

五、继承与友元

六、继承与静态成员

七、复杂的菱形继承及菱形虚拟继承

(一)单继承与多继承

(二)菱形继承

(三)菱形虚拟继承

八、继承的总结和反思

结语


前言

在C++ 编程世界里,继承是一项极为关键的特性,它为代码的复用和层次化设计提供了强大支持。掌握继承机制,对于编写高效、可维护的C++ 代码至关重要。今天,就让我们一起深入探究C++ 中的继承。

一、继承的概念及定义

继承是面向对象程序设计实现代码复用的重要手段。它允许我们在保持原有类特性的基础上进行扩展,产生新的类,即派生类。这体现了面向对象程序设计的层次结构,从简单到复杂逐步构建。

定义格式上,以 class Student : public Person 为例, Person 是基类(父类), Student 是派生类(子类) , public 是继承方式。继承方式有 public 、 protected 和 private 三种,不同继承方式会改变基类成员在派生类中的访问权限。

比如,基类的 public 成员在 public 继承下,在派生类中仍是 public 成员;但在 protected 继承下,就变为派生类的 protected 成员 。

二、基类和派生类对象赋值转换

派生类对象和基类对象之间存在特殊的赋值转换关系。派生类对象可以赋值给基类的对象、指针或引用,这就像把派生类中属于基类的那部分“切”出来进行赋值,形象地称为切片。例如:

Student sobj;Person pobj = sobj; Person* pp = &sobj; Person& rp = sobj; 

然而,基类对象不能直接赋值给派生类对象。不过,基类的指针或引用可以通过强制类型转换赋值给派生类的指针或引用,但这种转换需要谨慎,若基类是多态类型,可借助 RTTI (运行时类型信息)的 dynamic_cast 来确保安全转换。

三、继承中的作用域

在继承体系中,基类和派生类都有各自独立的作用域。当子类和父类存在同名成员时,子类成员会屏蔽父类对同名成员的直接访问,这种现象称为隐藏(重定义) 。比如:

class Person {protected:int _num = 111; };class Student : public Person {protected:int _num = 999; public:void Print() {cout << "Person::_num: " << Person::_num << endl;cout << "Student::_num: " << _num << endl;}};

在 Student 类的 Print 函数中,通过 Person::_num 明确访问父类的 _num 成员,避免混淆。实际编程中,应尽量避免在继承体系里定义同名成员,以免造成代码理解和维护上的困难。

四、派生类的默认成员函数

当我们定义派生类时,即便没有显式编写,编译器也会自动生成一些默认成员函数,主要包括以下几个方面:

1. 构造函数:派生类的构造函数必须调用基类的构造函数来初始化基类的那部分成员。若基类没有默认构造函数,就需在派生类构造函数的初始化列表中显式调用合适的基类构造函数。

2. 拷贝构造函数:派生类的拷贝构造函数要调用基类的拷贝构造函数,完成基类成员的拷贝初始化。

3. 赋值运算符函数:派生类的 operator= 必须调用基类的 operator= 来完成基类成员的复制。

4. 析构函数:派生类的析构函数在被调用完成后,会自动调用基类的析构函数,以清理基类成员,确保对象资源的正确释放,遵循先派生类后基类的清理顺序。

五、继承与友元

友元关系在继承体系中是不能自动继承的。也就是说,基类的友元不能访问子类的私有和保护成员。

父亲的朋友不是你的朋友

你需要和他成为朋友才可以访问(见注释)

例如:
 

class Student;class Person {public:friend void Display(const Person& p, const Student& s);protected:string _name; };class Student : public Person {//public://friend void Display(const Person& p, const Student& s);protected:int _stunNum; };void Display(const Person& p, const Student& s) {cout << p._name << endl;cout << s._stunNum << endl;}

这里 Display 函数作为 Person 类的友元,能访问 Person 类的保护成员,但对于 Student 类,它并不具备天然访问其保护成员的权限。

六、继承与静态成员

若基类定义了 static 静态成员,那么在整个继承体系中,无论派生出多少个子类,都只会存在一个该静态成员的实例。例如:

class Person {public:Person() { ++_count; }public:static int _count; };int Person::_count = 0;class Student : public Person {};

 Person 类中的 _count 静态成员,在 Student 类及其他派生类中都是共享的,可通过类名或对象来访问。

七、复杂的菱形继承及菱形虚拟继承

(一)单继承与多继承

单继承是指一个子类只有一个直接父类,关系简单明了。

而多继承则是一个子类有两个或以上直接父类,这种情况虽然增加了代码复用的灵活性,但也引入了一些复杂问题。

(二)菱形继承

菱形继承是多继承的一种特殊情况。以 class Assistant : public Student, public Teacher 为例, Student 和 Teacher 都继承自 Person ,这样 Assistant 中就会出现 Person 成员的两份拷贝,导致数据冗余和二义性问题。比如在访问 Assistant 对象中来自 Person 的成员时,编译器无法明确确定访问的是哪一个 Person 成员。

数据冗余和二义性: Assistant 中就会出现 Person 成员的两份拷贝

(三)菱形虚拟继承

为解决菱形继承的数据冗余和二义性问题,引入了虚拟继承。在 Student 和 Teacher 继承 Person 时使用虚拟继承(如 class Student : virtual public Person  ),

就能确保在 Assistant 对象中只存在一份 Person 成员的拷贝。虚拟继承通过虚基表指针和虚基表来管理基类成员的存储和访问,有效解决了上述问题,但也增加了一定的实现复杂度。

原理图

示例代码

下图是菱形虚拟继承的内存对象成员模型:这里可以分析出D对象中将A放到的了对象组成的最下面,这个A同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A。

八、继承的总结和反思

继承在C++ 中是把双刃剑。它极大地促进了代码复用,构建了清晰的类层次结构,但也带来了一些问题。多继承衍生出的菱形继承和复杂的底层实现,让代码复杂度和维护难度上升,这也是许多其他面向对象语言(如Java)不采用多继承的原因。

在实际编程中,我们要谨慎选择继承和组合。继承是“is - a”关系,每个派生类对象都是一个基类对象;组合是“has - a”关系,一个类包含另一个类的对象。优先考虑对象组合,因为它耦合度低,代码维护性好,更符合“黑箱复用”原则;而继承适用于需要体现类之间层次关系,或实现多态的场景。

结语

C++ 的继承机制丰富而复杂,深入理解它的各个方面,从基本概念到复杂应用,能让我们在编程时更得心应手,编写出结构良好、高效且易于维护的代码。希望通过这篇博客,大家能对C++ 继承有更透彻的认识,在后续编程实践中灵活运用。


文章转载自:

http://nvSatH0v.cpktd.cn
http://84teMgZe.cpktd.cn
http://cndbqjOc.cpktd.cn
http://61chRDAH.cpktd.cn
http://Kug1fTLY.cpktd.cn
http://DkKgSUwZ.cpktd.cn
http://zm4Nrnvm.cpktd.cn
http://R3Hpj0az.cpktd.cn
http://DAJiZT7Z.cpktd.cn
http://ZFlH6hx8.cpktd.cn
http://pO7p1Xl8.cpktd.cn
http://XktIqPqf.cpktd.cn
http://IejPxEvB.cpktd.cn
http://sDM02Rpa.cpktd.cn
http://tm3elGYT.cpktd.cn
http://KVlALIU0.cpktd.cn
http://toeF3eZm.cpktd.cn
http://oDgop3Wk.cpktd.cn
http://qbTZ8sgq.cpktd.cn
http://xmrhhWhz.cpktd.cn
http://KPdLS7G5.cpktd.cn
http://ydowVKNU.cpktd.cn
http://vuI3qC3z.cpktd.cn
http://boBVUaP9.cpktd.cn
http://8u4x4jcw.cpktd.cn
http://M3nRofnU.cpktd.cn
http://vLs35eS1.cpktd.cn
http://dNl5YsLc.cpktd.cn
http://yyy6xwHr.cpktd.cn
http://SXCidEEC.cpktd.cn
http://www.dtcms.com/wzjs/688246.html

相关文章:

  • 网站建设活动方案南浦电商网站建设
  • 萝岗高端网站建设网店推广平台有哪些
  • 建筑设计网站网址怎么做贝店式的网站
  • 找工作哪个网站好2022太原线上推广公司
  • 网站前台可以打开网站开发高级工程师
  • vue适合什么样的网站开发wordpress怎样发询盘
  • 网站代码编辑器玉溪网站建设
  • 上海营销型网站建设费用怎么创建网页快捷方式
  • 免费无版权图片素材网站网页搜索功能怎么实现
  • 青海城乡建设厅网站 官网为什么要做营销型的网站建设
  • 深圳营销型网站建设公司网络服务安卓软件怎么开发
  • 做国际网站要多少钱广告代理平台
  • 福州高端建站临沂哪里有做网站
  • 软件开发培训就业windows优化大师破解版
  • nat123做视频网站怎么让网站被百度收录
  • 宣武门网站建设怎么做仿制网站
  • 重庆手机网站推广资料哪个网站买域名好
  • 移动网站 pc网站的区别吗怎么在百度建网站
  • 地域购物网站网站建设需要大约多少钱
  • 站长工具seo优化网页前端开发框架
  • 商城网站开发定制ie浏览器在线使用
  • seo网站排名推广企业网站服务
  • 甘肃住房城乡建设厅网站网站建设岗位廉政风险防控
  • 个人可以做商城网站吗建设电子商务网站必须首先确定的是
  • 超级工程网站建设上海中心大厦建设集团简介
  • 宁波网站建设 慕枫科技兼职给企业做网站
  • 网站建设项目设计表淄博营销型网站建设
  • 做网站有必要做app吗软件开发公司的管理
  • 网站刷流量对网站有影响吗pageadmincms
  • 外贸网站建设合同软件网站技术开发公司