首页 > 其他分享 >多重继承二义性的解决方法

多重继承二义性的解决方法

时间:2024-10-30 14:47:53浏览次数:3  
标签:多重 二义性 cout 继承 子类 父类 指针

多重继承二义性的解决方法

多重继承、钻石继承、虚继承

1、多重继承
当一个类继承了多个父类时,称为多重继承,会按照继承表的顺序在子类中排列父类的内容,当把子类指针对象转换为父类指针时,编译器会自动计算出该父类内容所在的位置,并让指针偏移到该位置,因此,可能会出现转换后的父类指针与转换前子类指针不相同的情况
2、钻石继承
假如有一个类A,类B和类C都继承了类A,类D又同时继承了类B和类C,当子类的父类中有共同的祖先时,这种称为钻石继承
1、类B和类C中都各自有类A的内容
2、类D会继承类B和类C中的所有内容,就会导致类D中有两份类A的内容
3、当类D对象去访问类A中的成员时,编译器会产生歧义,不确定要使用的是哪份类A中的成员,因此编译不通过
3、虚继承
当使用 virtual 关键字修饰继承表时,此时变成虚继承,此时子类中就会多一个虚指针用于指向父类的内容,当这个子类被继承时,孙子类中也会继承该虚指针,并且通过虚指针比较是否含有多份相同的祖先类,如果有则只保留一份

在了解了这三种继承之后再回顾题目的问题,

​ 如果是多重继承:1.通过指定的继承路线

class A
{
  	public:
    	void func()
        {
            cout<<A::func<<endl;
        }
};
class B
{
    public:
    	void func()
        {
            cout<<B::func<<endl;
        }
};
class C:public A,public B
{
    
};

int main()
{
    C test;
    test.A::func();//指定为A
    return 0;
}


​ 2.同名覆盖

#include<iostream>
using namespace std;

class A
{
    public:
       void func()
      {
       cout<<"A::func() called"<<endl;
       }
};

class B
{
    public:
       void func()
        {
            cout<<"B::func() called"<<endl;
        }
};

class C:public A,public B
{
    public:
       void func()//子类中使用与父类相同名称的函数,覆盖。
        {
            cout<<"C::func() called"<<endl;
        }
};

int main()
{
    C c;
    c.func();
    return 0;

}

3.如果属于钻石继承,可以通过虚继承,解决二义性。

#include<iostream>
using namespace std;

class A
{
    public:
       void func()
      {
       cout<<"A::func() called"<<endl;
       }
};

class B:virtual public A
{

};

class C:virtual public A
{
    
};

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

int main()
{
   D d;
    d.func();
    return 0;

}

标签:多重,二义性,cout,继承,子类,父类,指针
From: https://blog.csdn.net/m0_57538342/article/details/143365253

相关文章

  • 探索C++的类与继承之美:从基础到高级
    C++是一种强大的面向对象编程语言,其特性允许开发者利用类和继承来构建复杂的数据结构和功能。在本篇博客中,我们将通过一些示例代码,详细解析C++中的类、继承、虚继承、访问控制以及多重继承的概念。类的定义与基本特性类是C++的基本构建块,允许我们定义一个新的数据类型,该类型......
  • GaussDB云原生数据库SQL引擎继承原来openGauss的词法解析,语法解析,查询重写,查询优化和
    云原生数据库SQL引擎继承原来openGauss的词法解析,语法解析,查询重写,查询优化和执行引擎的能力。由于云原生数据库是shareddisk架构,一个事务在一个节点上执行,所以不需要原来分布式根据分布式key进行数据分布,分布式执行和分布式2PC提交的能力。为了支持数据库粒度的异地多活,云原生......
  • Java为什么不使用多继承?
    Java不使用多继承是为了:一、避免菱形继承问题;二、简化代码和维护;三、引入接口实现多继承功能;四、遵循设计原则。避免菱形继承问题可以使代码更加稳健可靠,降低了开发复杂度,从而便于团队协作和维护。一、避免菱形继承问题多继承意味着一个类可以从多个父类继承属性和方法。虽然......
  • 【继承】讲解
    访问控制传递下去可以一共分为四个特性公有保护私有存在但不可见虽然它们各自的特性不同,能不能使用也另说,但是在建立类对象的时候,系统都会申请相应的内存,也就是说,无论它们能不能用,它们都存在。公有继承基类的私有数据成员存在但在派生类里不可见即不可直接使用:但......
  • Flutter 自定义组件继承与调用的高级使用方式
    ✅近期推荐:求职神器https://bbs.csdn.net/topics/619384540......
  • C++的继承和多态
    继承继承的本质意义是复用(不用写就有)父类的某些东西可以直接使用eg.但是注意:被继承的成员是新的成员,不是共用同一个成员(实例化的成员变量不同)         但是调用的函数是同一个函数继承基类成员访问方式的变化(重点)private访问 "在派......
  • C++:继承与多态(面试题篇)
    文章目录前言1.什么是多态?2.什么是重载、重写(覆盖)、重定义(隐藏)?3.多态的实现原理?4.inline函数可以是虚函数吗?5.静态成员可以是虚函数吗?6.构造函数可以是虚函数吗?7.析构函数可以是虚函数吗?什么场景下析构函数是虚函数?8.对象访问普通函数快还是虚函数更快?9.虚......
  • JavaSE-继承(包含Object类)
    目录继承(包含Object类)何为继承优点代码复用易于维护和扩展缺点紧密耦合缺乏灵活性常用的方法Object类Object类中的常用方法:方法重写规则方法重写规则方法重写与方法重载的区别示例代码super关键字的用法示例代码final关键字的用法示例代码继承(包含Object类)何为继承在面向对象编......
  • Swift 中的协议和继承有什么区别?
    协议和继承在Swift中都用于定义一个类型应有的行为,但它们的使用场景和方式有明显区别:1、 协议定义了一个蓝图,规定了遵循协议的类型必须实现的方法和属性,但不提供这些方法和属性的具体实现。协议可以被枚举、结构体和类遵循。2、 继承允许一个类继承另一个类的特性,如方法和属性......
  • Java-继承与多态-下篇
    ......