C++多继承

C++基础讲解第五期(继承、多继承、虚继承、向上转型、同名函数) 当我使用C习惯之后,在写链表的时候会去考虑二级指针,以及链表变了怎么才能反映出来。其实,在我们实现类的成员函数时,在成员函数里面去对成员变量进行改变,当我们去实例化这个类的时候,这个成员函数和成员变量才真正的产出,比如上面的insertNode(),在它的里面直接用了成员变量head,但是当我实例化出list的时候,调用list.insertNode()的时候,使用的就是list对象的head,改变它,就时有效的,生命周期一直到这个对象销毁。不像C中,生命周期是它的本函数内,所以要传二级指针。 阅读详情
多继承可以看作是单继承的扩展。所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。

  多继承下派生类的定义格式如下:

  class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
   {
    <派生类类体>
   };

  其中,<继承方式1>,<继承方式2>,…是三种继承方式:public、private、protected之一。例如:

class A
{
…
};
class B
{
…
};
class C : public A, public, B
{
…
};


其中,派生类C具有两个基类(类A和类B),因此,类C是多继承的。按照继承的规定,派生类C的成员包含了基类B中成员以及该类本身的成员。

  多继承的构造函数

  在多继承的情况下,派生类的构造函数格式如下:

  <派生类名>(<总参数表>):<基类名1>(<参数表1>),<基类名2>(<参数表2>),…
   <子对象名>(<参数表n+1>),…
    {
     <派生类构造函数体>
    }

  其中,<总参数表>中各个参数包含了其后的各个分参数表。

  多继承下派生类的构造函数与单继承下派生类构造函数相似,它必须同时负责该派生类所有基类构造函数的调用。同时,派生类的参数个数必须包含完成所有基类初始化所需的参数个数。

  派生类构造函数执行顺序是先执行所胡基类的构造函数,再执行派生类本身构造函数,处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的各基类顺序,与派生类构造函数中所定义的成员初始化列表的各项顺序无关。也就是说,执行基类构造函数的顺序取决于定义派生类时基类的顺序。可见,派生类构造函数的成员初始化列表中各项顺序可以任意地排列。
 
  下面通过一个例子来说明派生类构造函数的构成及其执行顺序。

#include
class B1
{
public:
B1(int i)
{
b1 = i;
cout<<"构造函数 B1."< }
void print() { cout< private:
int b1;
};

class B2
{
public:
B2(int i)
{
b2 = i;
cout<<"构造函数 B2."< }
void print() { cout< private:
int b2;
};

class B3
{
public:
B3(int i)
{
b3 = i;
cout<<"构造函数 B3."< }
int getb3() { return b3; }
private:
int b3;
};
class A : public B2, public B1
{
public:
A(int i, int j, int k, int l):B1(i), B2(j), bb(k)
{
a = l;
cout<<"构造函数 A."< }
void print()
{
B1::print();
B2::print();
cout< }
private:
int a;
B3 bb;
};

void main()
{
A aa(1, 2, 3, 4);
aa.print();
}


  该程序的输出结果为:

   构造函数 B2.2

   构造函数 B1.1

   构造函数 B3.3

   构造函数 A.4

   1

   2

   4, 3

  在该程序中,作用域运算符::用于解决作用域冲突的问题。在派生类A中的print()函数的定义中,使用了B1::print;和B2::print();语句分别指明调用哪一个类中的print()函数,这种用法应该学会。

C++多继承

8/27/2001 8:37:55· ·--··pcvc


上一页 1 2 


  二义性问题

  一般说来,在派生类中对基类成员的访问应该是唯一的,但是,由于多继承情况下,可能造成对基类中某成员的访问出现了不唯一的情况,则称为对基类成员访问的二义性问题。

  实际上,在上例已经出现过这一问题,回忆一下上例中,派生类A的两基类B1和B2中都有一个成员函数print()。如果在派生类中访问print()函数,到底是哪一个基类的呢?于是出现了二义性。但是在上例中解决了这个问题,其办法是通过作用域运算符::进行了限定。如果不加以限定,则会出现二义性问题。

  下面再举一个简单的例子,对二义性问题进行深入讨论。例如:

class A
{
public:
void f();
};

class B
{
public:
void f();
void g();
};

class C : public A, public B
{
public:
void g();
void h();
};


  如果定义一个类C的对象c1:

   C c1;

  则对函数f()的访问

   c1.f();

  便具有二义性:是访问类A中的f(),还是访问类B中的f()呢?

  解决的方法可用前面用过的成员名限定法来消除二义性,例如:

   c1.A::f();

  或者

   c1.B::f();

  但是,最好的解决办法是在类C中定义一个同名成员f(),类C中的f()再根据需要来决定调用A::f(),还是B::f(),还是两者皆有,这样,c1.f()将调用C::f()。

  同样地,类C中成员函数调用f()也会出现二义性问题。例如:

  viod C::h()
   {
    f();
   }

  这里有二义性问题,该函数应修改为:

   void C::h()
   {
    A::f();
   }

  或者

   void C::h()
   {
    B::f();
   }

  或者

   void C::f()
   {
    A::f();
    B::f();
   }

  另外,在前例中,类B中有一个成员函数g(),类C中也有一个成员函数g()。这时,

   c1.g();

  不存在二义性,它是指C::g(),而不是指B::g()。因为这两个g()函数,一个出现在基类B,一个出现在派生类C,规定派生类的成员将支配基类中的同名成员。因此,上例中类C中的g()支配类B中的g(),不存在二义性,可选择支配者的那个名字。

  当一个派生类从多个基类派生类,而这些基类又有一个共同的基类,则对该基类中说明的成员进行访问时,也可能会出现二义性。例如:

class A
{
public:
int a;
};
class B1 : public A
{
private:
int b1;
};
class B2 : public A
{
private:
int b2;
};
class C : public B1, public B2
{
public:
int f();
private:
int c;
};


  已知:C c1;

  下面的两个访问都有二义性:

  c1.a;
  c1.A::a;

  而下面的两个访问是正确的:

  c1.B1::a;
  c1.B2::a;

  类C的成员函数f()用如下定义可以消除二义性:

  int C::f()
   {
    retrun B1::a + B2::a;
   }

  由于二义性的原因,一个类不可以从同一个类中直接继承一次以上,例如:

  class A : public B, public B
   {
    …
   }

  这是错误的。
C-08-实战:搭建一个AI客服机器人(接入微信企微) 客服是一人公司最大的时间杀手。本文教你搭建一个AI客服机器人,能自动回答80%的常见问题,只把复杂问题转给人工。含微信公众号和企业微信接入完整代码。 阅读详情

相关推荐

不只是抓取:用五指灵巧手(ROH-A001/RH56)玩转ROS2下的力控与混合控制

本文深入探讨了在ROS2环境下使用五指灵巧手(ROH-A001/RH56)实现力控与混合控制的实战技巧。从硬件通信协议解析到ROS2节点开发,详细介绍了力感知架构、实时数据处理和混合控制策略,帮助开发者在Ubuntu系统中高效实现精密操作。通过鸡蛋抓取等实例,展示了力控技术在机器人灵巧操作中的关键作用。

weixin_28221501的博客 289

C++多继承同名函数

C++继承多继承同名函数 多继承同名函数 如果某派生类的多个基类拥有同名的成员,同时,派生类又新增这样的同名成员,在这种情况下,派生类成员将因此所有基类的同名成员。使用“对象名.成员名”或“对象指针名->成员名”方式可以唯一标识和访问派生类新增成员,基类的同名成员也可以使用基类名或作用域分辨符访问 #include<iostream> using namespace std; class BaseClass { public: void fn1() { cout << "

qq_52023825的博客 3404

免费大容量国外网盘测评:冷数据归档与rclone加密接入

云存储的本质,是通过对象存储、冗余编码和分层缓存,把本地磁盘容量问题转化为网络访问与数据管理问题。免费大容量国外网盘常以空间换用户规模或付费转化,容量政策、传输策略、协议支持和退出成本,往往比标称容量更决定长期可用性。支持 WebDAV、S3 兼容和命令行工具的服务,可接入 rclone 等自动化流程,再配合客户端加密与冷热分层,用于冷数据归档、老项目备份和家庭影像保存。理解带宽换算、单文件上限、保活机制与传输一致性后,评估话题型大容量网盘与专业向协议网盘,就能把免费空间纳入可靠存储层。围绕免费大容量国外网

weixin_31292729的博客 215

6、c++ 继承中的同名(多态)问题

还是以实战为导向,遇到问题查找问题,最近需要NDK开发,所以就得继续重温学习c++,现把c++继承中子类和父类函数同名问题记录下

roujian0985的博客 2560

sdc时钟约束2——多驱动时钟

sdc 多驱动时钟 master_clock

qq_40411444的博客 5529

TWINCAT3保姆级教程:手把手教你给Ecat从站烧录EEPROM(含XML配置避坑指南)

本文提供TWINCAT3环境下Ecat从站EEPROM烧录的完整教程,涵盖XML配置避坑指南。详细讲解环境准备、设备扫描、XML文件配置、EEPROM烧录流程及故障排查,帮助工程师高效解决设备识别问题,提升产线调试效率。

weixin_30693683的博客 518

C++学习之路-多继承

多继承,顾名思义就是继承多个父类。以往派生类只有一个基类,叫作单继承。派生类有两个或者两个以上的基类,就叫作多继承。 多继承的语法也很简单,将多个基类用逗号隔开。 例如已声明了类A、类B和类C,那么可以这样来声明派生类D: 可以看到一个细节,可以分别用不同的方式继承基类,比如public, private, protected。但我们学过继承(可以看之前的博文),继承方式尽量只选public。派生类初始化基类中的private成员变量,都需要借助初始化列表的初始化方式,并且调用基类中的构造函数,间接的去初始

weixin_45452278的博客 1258

【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~ 文章目录本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~一、项目展示二、项目资源共享1:训练图片:香烟图片+吸烟手势+烟雾三、

cv君的博客 13万+

C++继承-基本语法--继承方式--继承同名成员处理方式--多继承语法--菱形继承

1.基本语法 继承:减少重复代码 语法:class 子类:继承方式 父类 子类也叫派生类,父类也叫基类 派生类中的成员包括两大部分 一类是从基类继承过来的,一类是自己增加的成员。 从基类继承过来的表现其共性,而新增的成员体现了其个性。 #include<iostream> #include<string> using namespace std; class BasePage {//基类 public: void header() { cout << "1" &lt

一季南凉的博客 683

2025年5月架构设计师论文真题回顾,附写作技巧、所涉知识点及参考范文(三)

本文主要回顾2025年上半年(2025-5-24)系统架构设计师考试下午论文的题目,同时附带写作技巧、所涉知识点及参考范文。试题三:多模型数据库及应用。

一几文的编程学习笔记。 634

大数据领域数据产品的团队激励与绩效管理

在大数据领域,数据产品的成功离不开高效协作的团队。团队激励与绩效管理的目的在于激发团队成员的工作热情和创造力,提高工作效率和质量,确保数据产品能够按时、高质量地交付。本文章的范围涵盖了大数据领域数据产品团队激励与绩效管理的各个方面,包括激励机制的设计、绩效评估的方法、团队沟通与协作等。本文将按照以下结构进行阐述:首先介绍核心概念与联系,明确相关概念的定义和相互关系;接着讲解核心算法原理和具体操作步骤,为团队激励与绩效管理提供理论支持和实践指导;然后分析数学模型和公式,帮助读者深入理解绩效评估的原理;

Java大师兄的博客 1018

C++ 多继承

派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明派生类D: class D: public A, private B, protected C{ //类D新增加...

weixin_45743799的博客 1550

22、忆阻器、忆阻系统及其神经形态应用综述

本文综述了忆阻器与忆阻系统的理论基础及其在神经形态系统中的广泛应用。从忆阻器的基本定义出发,介绍了其在非线性电路、存储技术、通信和神经形态计算等领域的应用潜力。重点探讨了基于忆阻器的神经元模型(如Hodgkin-Huxley、FitzHugh-Nagumo和Hindmarsh-Rose模型)、突触实现方式及多种忆阻神经网络架构,包括细胞神经网络、脉冲神经网络和递归神经网络等。此外,深入分析了忆阻器在水库计算中的理论研究与硬件实现进展,展示了其在时间序列处理、模式识别和信号预测等方面的优异性能。尽管忆阻技术前

kiwi8的博客 207

C++多继承(多重继承)

派生类都只有一个基类,称为单继承。除此之外,C++也支持多继承,即一个派生类可以有两个或多个基类。 多继承的语法也很简单,将多个基类用逗号隔开。 例如已声明了类A、类B和类C,那么可以这样来声明派生类D: class D: public A, private B, protected C { //类D新增加的成员 } D 是多继承形式的派生类,它以公有的方式继承 A 类,以私有的方式继承 B 类,以保护的方式继承 C 类。D 根据不同的继承方式获取 A、B、C 中的成员,确定它们在派生类中的访问权

TT的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

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

【C++】 多继承

C++多继承机制允许派生类同时继承多个基类,提供代码复用的灵活性,但也带来二义性和内存布局复杂性。多继承下,派生类对象按基类声明顺序存储各基类子对象,构造函数需显式调用所有基类构造函数,调用顺序遵循继承顺序。当不同基类拥有同名成员或出现菱形继承时,会产生二义性问题,可通过作用域限定符或虚继承解决。虚继承通过共享间接基类实例,确保最终派生类只保留一份拷贝,其实现依赖虚基类表和运行时偏移量计算。多继承虽强大,但需谨慎使用以避免设计陷阱。

qq_45937810的博客 852

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c++的特性之一 多继承

多继承(Multiple Inheritance)是面向对象编程中的一个概念,它允许一个类继承自多个父类。

2403_84775671的博客 1089

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++单/多继承详解

C++的继承机制相对其他语言是比较复杂的一种,不同于java只支持单继承,C++不仅支持单继承,也支持多继承,对于多继承中的菱形问题会引发一系列的麻烦,C++的两个重要缺陷,一个是多继承,一个是垃圾回收器。本文将详细讲解C++的单继承和多继承,以及菱形继承的解决方法及原理。

分享学习的知识,记录我的技术成长道路 2304

C++之多继承

C++支持多继承,其它的面向对象编程语言几乎都不支持多继承。而多继承一旦使用不当就会造成二义性。这可能就是其它语言都不支持多继承的原因。实际来看,几乎没有使用多继承的必要性。 下面来段代码展示一下多继承和二义性。 ...

zy010101博客 1042

多继承 C++

多继承即一个子类可以有多个父类,它继承了多个父类的特性。 C++ 类可以从多个类继承成员,语法如下: class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… { <派生类类体> }; 其中,访问修饰符继承方式是public、protected或private其中的一个,用来修饰每个基类,各个基类之间用逗号分隔,如上所示。现在让我们一起看看下面的实例: 另外多继承(环状继承),A-&g...

生活需要深度 3064

C++批评系列——多继承

多继承Ian Joynercber 译Eiffel和C++都提供了多继承的机制。但Java却没有,因为它认为多继承会导致许多问题的出现。不过Java提供了接口(interface)作为一种替换机制,它类似于Objective C中的协议(protocol)。Sun宣称接口可以提供多继承所能提供的所有特性。Sun所宣称的“多继承会带来许多的问题”这个观点是对的,尤其是在C++中用以实现多继承的方法更

luckysky的专栏 1334

当C++多继承遇上类型转换

1 由来 客户用陈旧的VC++6.0进行项目开发,有一块功能需要我来实现。让一个早就习惯了VS2013的人去使用C++支持不太好的VC6去做开发实在是非常不爽,于是另辟蹊径,打算使用VC++2013开发编译出DLL,供VC6下调用即可。使用C++开发DLL的基本原则是减少暴露和接口简单化,最常用的方式就是使用纯虚类导出接口。另一种就是使用C++实现,但是导出时只导出C函数。处于使用的便利性考虑,

smstong的成长轨迹 7672
上一篇: C++单继承
下一篇: C++常类型(const)
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值