首页 > 其他分享 >多继承二义性、虚继承和虚基类

多继承二义性、虚继承和虚基类

时间:2023-06-08 16:14:42浏览次数:33  
标签:二义性 继承 public int 基类 class

为了解决多继承时的命名冲突问题,C++ 提出了虚继承。虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。这个被共享的基类就称为虚基类。

虚继承的使用:

格式:
在继承方式前面加上 virtual 关键字就是虚继承
#include <iostream>

using namespace std;

class A
{
public:
    int temp;
};

class B : public A
{
};

class C : public A
{
};

class D : public B, public C
{
};

int main(int argc, char *argv[])
{
    D d;
    // cout << &d.temp<< endl; // 报错:多继承命名冲突,产生二义性问题
    cout << &d.B::temp << endl;
    cout << &d.C::temp << endl;

    return 1;
}

输出:
0x61fe18
0x61fe1c

使用虚继承后,不再命名冲突

#include <iostream>

using namespace std;

class A
{
public:
    int temp;
};
// 使用虚继承
class B : virtual public A
{
};
// 使用虚继承
class C : virtual public A
{
};

class D : public B, public C
{
};

int main(int argc, char *argv[])
{
    D d;
    cout << &d.temp<< endl; // 使用虚继承后,没有命名冲突了
    cout << &d.B::temp << endl;
    cout << &d.C::temp << endl;

    return 1;
}

输出:
0x61fe10
0x61fe10
0x61fe10

总结:
可以看到,使用多继承经常会出现二义性问题,必须十分小心。上面的例子是简单的,如果继承的层次再多一些,关系更复杂一些,程序员就很容易陷入迷魂阵,程序的编写、调试和维护工作都会变得更加困难,因此我不提倡在程序中使用多继承,只有在比较简单和不易出现二义性的情况或实在必要时才使用多继承,能用单一继承解决的问题就不要使用多继承。也正是由于这个原因,C++ 之后的很多面向对象的编程语言,例如 Java、C#、PHP 等,都不支持多继承。

标签:二义性,继承,public,int,基类,class
From: https://www.cnblogs.com/kbqlm/p/17466767.html

相关文章

  • 【web 开发】PHP面向对象中类的继承
    前言继承(inheritance)是OOP中最重要的特性与概念。父类拥有其子类的公共属性和方法。子类除了拥有父类具有的公共属性和方法以外,还拥有自己独有的属性和方法。一个类可以在声明中用extends,关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。被继承的方法......
  • 8.2 类继承定义
    //class子类extentd父类{}//很多情况下:会把子类称为派生类,把父类称为超类(superCall)classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){......
  • 直播app开发搭建,web前端JS中的继承方式
    直播app开发搭建,web前端JS中的继承方式ES5//ES5中的写法一   functionPhone(color){    this.color=color;    this.show=function(){      console.log("你喜欢看的颜色是:"+this.color);    }  }  functionVivo(color......
  • 继承
    子类和父类(基类和派生类)派生的四个步骤:1.继承基类成员:除构造函数与析构函数外全部继承。2.改造基类成员:同名成员变量和成员函数覆盖,否则是重载。3.发展新成员4.重写构造函数与析构函数。继承的特性:1.构造函数调用:创建派生类的对象时,先依次调用基类的构造函数,后执行派生类的构......
  • Python 子类继承了多个父类 , MRO查找调用方法
      在Python中,如果一个子类继承了多个父类,而这些父类中都有同名的方法或属性,那么子类在调用这个方法或属性时,会按照MRO(MethodResolutionOrder,方法解析顺序)的规则进行查找和调用。在Python中,MRO的顺序是由C3算法计算出来的。C3算法是一种基于拓扑排序和合并的算法,用......
  • QA|定义的basepage在被a、b继承后,先后对a、b实例化调用后,存在b实例找不到driver问题|U
      iops登录后,需要对登录后的iops主页操作:点击对应按钮,如下 此时我需要调试一下iops_home_page.py中的代码,但需要先登录才调试这块代码,代码如下:运行:结果起来两个浏览器,没有点击进去 或者有时会报错:找不到ih的属性:self.driver()原因:因上面iops_homepage没有继承上lo......
  • C++继承
      三类继承方式子类会将父类的所有非静态成员属性继承过来,只不过编译器隐藏了父类的私有属性,子类不可以访问。 1classBase{2public:3inta_;4protected:5intb_;6private:7intc_;8};910classSon:publicBase{11pu......
  • Godot的几个附加脚本和进行继承时比较特别的特性
    注:这是在Godot4.0中总结出的内容,并且语言是C#。特别的,下面有的特性和C#关系比较大。基本特性在Godot中,为某个节点编写特别的代码时,需要为节点新建脚本,或引用已有脚本。引用脚本时,填入脚本路径即可,相当于是复用代码了。新建脚本时,一般做法是新建一个自定义类型,并且......
  • java继承
    1.为什么要使用继承多类之间拥有相同的属性或是方法;解决方式是将相同的属性和方法抽取出来封装到一个新的类中,并继承新的类。2.继承语法AextendsB如果AextendsB得出结论;A是B的子类;B是A的父类java中一个类只能继承一个父类(单继承关系)继承的关键字是extends3.supersupe......
  • Java官方笔记6继承
    继承Java只有单继承,最顶级的父类是Object。子类会继承父类的fields和methods,而不会继承constructors,因为constructors不属于methods,但是子类可以通过super调用父类的constructor。子类继承父类的范围是:public、protected、package-private隐式转换,子类转父类(只有1个爸爸):Objec......