广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++多继承(多重继承)的实现
  • 318
分享到

C++多继承(多重继承)的实现

C++多继承C++多重继承 2023-05-16 15:05:34 318人浏览 独家记忆
摘要

在前面的例子中,派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,c++也支持多继承(Multiple Inheritance),即一个派生类可以有

在前面的例子中,派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,c++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。

多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#PHP 等干脆取消了多继承。

多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明派生类D:

class D: public A, private B, protected C{
    //类D新增加的成员
}

D 是多继承形式的派生类,它以公有的方式继承 A 类,以私有的方式继承 B 类,以保护的方式继承 C 类。D 根据不同的继承方式获取 A、B、C 中的成员,确定它们在派生类中的访问权限。

多继承下的构造函数

多继承形式下的构造函数和单继承形式基本相同,只是要在派生类的构造函数中调用多个基类的构造函数。以上面的 A、B、C、D 类为例,D 类构造函数的写法为:

D(形参列表): A(实参列表), B(实参列表), C(实参列表){
    //其他操作
}

基类构造函数的调用顺序和和它们在派生类构造函数中出现的顺序无关,而是和声明派生类时基类出现的顺序相同。仍然以上面的 A、B、C、D 类为例,即使将 D 类构造函数写作下面的形式:

D(形参列表): B(实参列表), C(实参列表), A(实参列表){
    //其他操作
}

那么也是先调用 A 类的构造函数,再调用 B 类构造函数,最后调用 C 类构造函数。

下面是一个多继承的实例:

#include <iOStream>
using namespace std;
//基类
class BaseA{
public:
    BaseA(int a, int b);
    ~BaseA();
protected:
    int m_a;
    int m_b;
};
BaseA::BaseA(int a, int b): m_a(a), m_b(b){
    cout<<"BaseA constructor"<<endl;
}
BaseA::~BaseA(){
    cout<<"BaseA destructor"<<endl;
}
//基类
class BaseB{
public:
    BaseB(int c, int d);
    ~BaseB();
protected:
    int m_c;
    int m_d;
};
BaseB::BaseB(int c, int d): m_c(c), m_d(d){
    cout<<"BaseB constructor"<<endl;
}
BaseB::~BaseB(){
    cout<<"BaseB destructor"<<endl;
}
//派生类
class Derived: public BaseA, public BaseB{
public:
    Derived(int a, int b, int c, int d, int e);
    ~Derived();
public:
    void show();
private:
    int m_e;
};
Derived::Derived(int a, int b, int c, int d, int e): BaseA(a, b), BaseB(c, d), m_e(e){
    cout<<"Derived constructor"<<endl;
}
Derived::~Derived(){
    cout<<"Derived destructor"<<endl;
}
void Derived::show(){
    cout<<m_a<<", "<<m_b<<", "<<m_c<<", "<<m_d<<", "<<m_e<<endl;
}
int main(){
    Derived obj(1, 2, 3, 4, 5);
    obj.show();
    return 0;
}

运行结果:

BaseA constructor
BaseB constructor
Derived constructor
1, 2, 3, 4, 5
Derived destructor
BaseB destructor
BaseA destructor

从运行结果中还可以发现,多继承形式下析构函数的执行顺序和构造函数的执行顺序相反。

命名冲突

当两个或多个基类中有同名的成员时,如果直接访问该成员,就会产生命名冲突,编译器不知道使用哪个基类的成员。这个时候需要在成员名字前面加上类名和域解析符::,以显式地指明到底使用哪个类的成员,消除二义性。

修改上面的代码,为 BaseA 和 BaseB 类添加 show() 函数,并将 Derived 类的 show() 函数更名为 display():

#include <iostream>
using namespace std;
//基类
class BaseA{
public:
    BaseA(int a, int b);
    ~BaseA();
public:
    void show();
protected:
    int m_a;
    int m_b;
};
BaseA::BaseA(int a, int b): m_a(a), m_b(b){
    cout<<"BaseA constructor"<<endl;
}
BaseA::~BaseA(){
    cout<<"BaseA destructor"<<endl;
}
void BaseA::show(){
    cout<<"m_a = "<<m_a<<endl;
    cout<<"m_b = "<<m_b<<endl;
}
//基类
class BaseB{
public:
    BaseB(int c, int d);
    ~BaseB();
    void show();
protected:
    int m_c;
    int m_d;
};
BaseB::BaseB(int c, int d): m_c(c), m_d(d){
    cout<<"BaseB constructor"<<endl;
}
BaseB::~BaseB(){
    cout<<"BaseB destructor"<<endl;
}
void BaseB::show(){
    cout<<"m_c = "<<m_c<<endl;
    cout<<"m_d = "<<m_d<<endl;
}
//派生类
class Derived: public BaseA, public BaseB{
public:
    Derived(int a, int b, int c, int d, int e);
    ~Derived();
public:
    void display();
private:
    int m_e;
};
Derived::Derived(int a, int b, int c, int d, int e): BaseA(a, b), BaseB(c, d), m_e(e){
    cout<<"Derived constructor"<<endl;
}
Derived::~Derived(){
    cout<<"Derived destructor"<<endl;
}
void Derived::display(){
    BaseA::show();  //调用BaseA类的show()函数
    BaseB::show();  //调用BaseB类的show()函数
    cout<<"m_e = "<<m_e<<endl;
}
int main(){
    Derived obj(1, 2, 3, 4, 5);
    obj.display();
    return 0;
}

请读者注意第 64、65 行代码,我们显式的指明了要调用哪个基类的 show() 函数。

到此这篇关于C++多继承(多重继承)的实现的文章就介绍到这了,更多相关C++多继承内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++多继承(多重继承)的实现

本文链接: https://www.lsjlt.com/news/210081.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++多继承(多重继承)的实现
    在前面的例子中,派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有...
    99+
    2023-05-16
    C++多继承 C++多重继承
  • python 继承与多重继承
    当然,如果不支持python继承,语言特性就不值得称为“类”。派生类定义的语法如下所示: <statement-1> . . . <statement-N> 名称 BaseC...
    99+
    2023-01-31
    python
  • C#怎么实现多重继承
    这篇文章主要讲解了“C#怎么实现多重继承”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现多重继承”吧!C# 多重继承多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能...
    99+
    2023-06-17
  • 多重继承
      继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能 由于Python允许使用多重继承,因此,MixIn就是一种常见的设计 只允许单一继承的语言(如Java)不能使用MixIn的设计 通常的继承关系设计如下:   ...
    99+
    2023-01-31
  • python——多重继承
    #方式一 class A():     def __init__(self, name):         self.name = name         print("a class ...") class B():     def ...
    99+
    2023-01-31
    python
  • VB.NET如何实现多重继承
    小编给大家分享一下VB.NET如何实现多重继承,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!VB.NET多重继承我注意到了一个情况,那就是C#允许多重继承(multiple inheritance),但是在VB.NET里我...
    99+
    2023-06-17
  • C++中单继承与多继承如何使用
    今天小编给大家分享一下C++中单继承与多继承如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言C++的继承机制相对其...
    99+
    2023-06-30
  • 详解C++中单继承与多继承的使用
    目录前言1.继承的概念和定义(1)继承的概念(2)继承的定义方法(2)继承后子类的成员类型2.基类与派生类的赋值转换(1)派生类赋值给基类(2)基类给派生类3.继承中的作用域(1)隐...
    99+
    2022-11-13
  • JavaScript继承与多继承实例讲解
    这篇文章主要介绍“JavaScript继承与多继承实例讲解”,在日常操作中,相信很多人在JavaScript继承与多继承实例讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2022-10-19
  • C++中多重继承问题详解
    C++中多重继承问题详解引言在C++中,多重继承是一种特性,允许一个派生类从多个基类中继承属性和行为。然而,由于多重继承引入了一些复杂性,开发人员必须小心处理,以避免潜在的问题。本文将详细讨论C++中多重继承的问题,并提供具体的代码示例。基...
    99+
    2023-10-22
    C++ 多重继承 问题详解
  • java中怎么实现多重继承
    在Java中,一个类只能直接继承自一个父类,无法直接实现多重继承。但是可以通过接口来实现类似多重继承的功能。接口是一种抽象的类,它可...
    99+
    2023-09-14
    java
  • PHP5中怎么实现多重继承
    本篇文章给大家分享的是有关PHP5中怎么实现多重继承,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP5多重继承的具体代码:< //PHP5 接口&...
    99+
    2023-06-17
  • 如何实现C#继承与C#多态
    这篇文章主要讲解了“如何实现C#继承与C#多态”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现C#继承与C#多态”吧!在C#中实现OOP思想,丝毫不逊色于Java,下面我通知两句话来帮...
    99+
    2023-06-17
  • php是多继承还是单继承
    本文操作环境:windows10系统、php 7、thinkpad t480电脑。php是单继承还是多继承?可能你也被这个问题困惑很久了吧。首先,PHP是单继承,他是不支持多继承的。面向对象的特点是封装、继承、多态。这里的继承是指类与类之间...
    99+
    2016-11-13
    php 单继承 多继承
  • C++继承与虚继承怎么实现
    这篇文章主要介绍“C++继承与虚继承怎么实现”,在日常操作中,相信很多人在C++继承与虚继承怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++继承与虚继承怎么实现”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • 多继承 , 组合 , 菱形继承 , 接口
    一, 复习 属性的的正确存放位置: 类中应该存储所有对象公共的内容 对象中存储都是每个对象独有的(都不同) 初始化函数: 给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性 节省了重复代码 ...
    99+
    2023-01-31
    组合 菱形 接口
  • java怎么实现多重继承效果
    在Java中,类是不支持多重继承的,即一个类不能直接继承多个父类。但是可以通过接口来实现类似多重继承的效果。接口是一种特殊的类,它只...
    99+
    2023-08-08
    java
  • C++ 多继承详情介绍
    C++支持多继承,即允许一个类同时继承多个类。 关于多继承,一直以来争议不断,有一部分人认为多继承会带来大量的问题,为了解决这些问题会使得语言本身变得非常复杂,因此应当避免。另外一派...
    99+
    2022-11-13
  • python3中多重继承的问题
    本来以为多重继承很简单,但是多看了一些资料后发现还是挺复杂的。 如果继承情况简单就还比较好理解,但是如果继承的情况太过于复杂的话,python3 中会使用拓扑排序的方式来寻找继承的父类。 有关继承的拓扑排序 关于这方...
    99+
    2023-01-31
  • php怎么实现多继承
    这篇文章主要介绍“php怎么实现多继承”,在日常操作中,相信很多人在php怎么实现多继承问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php怎么实现多继承”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!tr...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作