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

北京市建设工程信息网招标国内做seo最好的公司

北京市建设工程信息网招标,国内做seo最好的公司,梧州门户网站,o2o模式的特点本篇要分享的内容是C中多继承的缺陷:菱形继承。 以下为本篇目录 目录 1.多继承的缺陷与解决方法 2.虚继承的底层原理 3.虚继承底层原理的设计原因 1.多继承的缺陷与解决方法 首先观察下面的图片判断它是否为多继承 这实际上是一个单继承,单继承的特…

本篇要分享的内容是C++中多继承的缺陷:菱形继承。

以下为本篇目录

目录

1.多继承的缺陷与解决方法

2.虚继承的底层原理

3.虚继承底层原理的设计原因


1.多继承的缺陷与解决方法

首先观察下面的图片判断它是否为多继承

这实际上是一个单继承,单继承的特点是一个子类只有一个直接继承的父类,即使又多层继承关系,但是只有一个直接父类,都称作单继承 

多继承的图示如下

 可以看到多继承中的子类扮演了两个角色,就相当于桃花既能开出好看的桃花,也能结果。

所以多继承的特点是一个子类有两个或以上的直接父类时称这个关系叫做多继承。

那在上图中使用多继承是没有错误的,他可以在一个类中结合多个类的特点,多继承的本身并没有错误,但是出错的往往是在一些使用场景下会有缺陷,如下图

有了多继承可能就会导致菱形继承(如上图)。

可以看到Student类和Teacher类都会继承Person中的属性,

但是此时Assistant同时又继承了Student类和Teacher类的话,Person中的属性在Assistant中就会出现两次,会有二义性。

这也是为什么java语言中没多继承用法的原因。

观察如下代码

#include<iostream>
using namespace std;
class Person
{
public:string _name; // 姓名
};class Student :  public Person
{
protected:int _num; //学号
};class Teacher : public Person
{
protected:int _id; // 职工编号
};class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修课程
};
void Test()
{// 这样会有二义性无法明确知道访问的是哪一个Assistant a;a._name = "peter";// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决a.Student::_name = "xxx";a.Teacher::_name = "yyy";
}

 可以看到在报错中它有规定使用的访问限定符,也就是说它会将同样的属性及信息再继承一份,也就是同时具有两份数据信息从而导致数据冗余占用空间,

如果Person类的空间很大,那么浪费的空间会更大。

那如何解决这样的问题呢?

首先我们可以使用访问限定符解决二义性

,这样使用没有问题

其次是在出现菱形继承的玩儿法之后C++祖师爷又更新了一个关键字:virtual(虚拟)

我们只需要在被多继承的类的继承方法前加上virtual,即可使用虚继承,

#include<iostream>
using namespace std;
class Person
{
public:string _name; // 姓名
};class Student : virtual public Person
{
protected:int _num; //学号
};class Teacher : virtual public Person
{
protected:int _id; // 职工编号
};class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修课程
};
void Test()
{// 这样会有二义性无法明确知道访问的是哪一个Assistant a;a._name = "peter";// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决a.Student::_name = "xxx";a.Teacher::_name = "yyy";
}

使用了虚继承之后就可以调用冗余数据的属性了

 

 可以看到,使用了虚继承之后不管是Student类中的_name还是Person类中的_name都不管用了,使用a直接可以调用_name,并且所用的空间也是同一份地址空间。

这样就解决了在菱形继承中数据冗余的问题。

但是在一个庞大的项目中这样的问题语法依旧会坑害不少人,所以尽量的能少用多继承,就要少用多继承。

2.虚继承的底层原理

既然要了解菱形继承的底层原理,我们不妨设计一个简单一点的代码便于观察,代码如下

class A
{
public:int _a;
};
class B : public A
//class B : virtual public A
{
public:int _b;
};
class C : public A
//class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};
int main()
{D d;d.B::_a = 1;d.C::_a = 2;d._b = 3;d._c = 4;d._d = 5;return 0;
}

那上面的菱形继承关系也很简单,如下图

除了观察菱形继承外,main函数中的内容对菱形继承的测试也同样重要;

我们将代码调试,并观察内存窗口。

使用D创建了对象d,在内存中观察d的地址即可。

 可以看到的是在B类存放了两个两个值,1和3

C类中也存放了两个值,2和4

D类中存放了一个值2,他与对象d中修改_d的值相同;

那这样存放数据是什么意思呢?

上面的代码没有使用虚函数,所以存放了两个值,导致了数据的二义性;

接下来我们使用虚函数,虚函数可以解决数据冗余和二义性的问题,我们继续观察内存的变化

class A
{
public:int _a;
};
//class B : public A
class B : virtual public A
{
public:int _b;
};
//class C : public A
class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};
int main()
{D d;d.B::_a = 1;d.C::_a = 2;d._b = 3;d._c = 4;d._d = 5;return 0;
}

使用了虚函数继续观察内存模块

和上面对比我们发现,在B类中存放了两行数据:第一行为一个地址,第二行为所修改的数据;

在C类中,存放的数据与B类相似

D和A中的数据被修改为最后所修改的数据;

可以看到在B类和C类中将地址取代了第一次所存的数据,从而达到解决数据二义性的目的;

那这个存放的地址又是什么意思是呢?

 我们继续再调出一个监视内存的窗口来观察

再第二个观察内存的窗口中输入B类的地址,这时你就会发现在第二个内存表中存在一个数,这个数子就是距离最终修改a的偏移量,上图为十六进制的14

当我们将B类中的第一行存放的地址加上十六进制的14,就会得到_a最终的值,_a=0;

我们再来举出一组例子来证明不是巧合

 可以看到_a只被赋值,而B中不仅存放了_b的值,同样也存放了一个指针,指向了距离A的偏移量,也同样是将B类中第一行的地址加上指针所指的偏移量(8),就是1所在的位置。

以上就是设计的原理,虽然设计很多内存和地址的关系,但是这就是虚函数底层的实现设计。

3.虚继承底层原理的设计原因

那为什么要这么设计呢?

如以下情况

一个B类创建的指针会指向bb对象,也有可能指向d对象,

所以我们无法得知这个指针所指向的对象,就只能靠指针来检查另一块内存上所存放的偏移量,通过计算偏移量来计算虚继承中二义性的变量。

以上就是菱形继承的设计缺陷以及后序的设计的解决思路,以及解决思路的底层设计。

其实多继承本身没有问题,只是菱形继承的用法让多继承成为了大坑。

即使本人水平有限,尽管不遗余力但本篇对虚继承的探索仍有不足,还请读者指正,感谢您的阅读。


文章转载自:
http://inflexed.sqxr.cn
http://celtic.sqxr.cn
http://exodontics.sqxr.cn
http://calibrate.sqxr.cn
http://oratorize.sqxr.cn
http://transmutation.sqxr.cn
http://buea.sqxr.cn
http://iceni.sqxr.cn
http://northwards.sqxr.cn
http://tpilisi.sqxr.cn
http://tessellate.sqxr.cn
http://blinking.sqxr.cn
http://potion.sqxr.cn
http://xxv.sqxr.cn
http://pillory.sqxr.cn
http://unture.sqxr.cn
http://indiscipline.sqxr.cn
http://idiotic.sqxr.cn
http://noble.sqxr.cn
http://aperitif.sqxr.cn
http://altitudinal.sqxr.cn
http://iridology.sqxr.cn
http://procrypsis.sqxr.cn
http://eent.sqxr.cn
http://checkrein.sqxr.cn
http://tripper.sqxr.cn
http://keeled.sqxr.cn
http://frontolysis.sqxr.cn
http://congealment.sqxr.cn
http://merthiolate.sqxr.cn
http://cytokinin.sqxr.cn
http://nlc.sqxr.cn
http://augment.sqxr.cn
http://collisional.sqxr.cn
http://freebooter.sqxr.cn
http://capoeira.sqxr.cn
http://constantsa.sqxr.cn
http://unlay.sqxr.cn
http://viselike.sqxr.cn
http://staidness.sqxr.cn
http://ratan.sqxr.cn
http://reestablishment.sqxr.cn
http://muffin.sqxr.cn
http://cyclization.sqxr.cn
http://annaba.sqxr.cn
http://peonage.sqxr.cn
http://microanatomy.sqxr.cn
http://autoloading.sqxr.cn
http://oss.sqxr.cn
http://clinquant.sqxr.cn
http://spoon.sqxr.cn
http://previsional.sqxr.cn
http://girl.sqxr.cn
http://sinic.sqxr.cn
http://drumstick.sqxr.cn
http://armoring.sqxr.cn
http://rubbingstone.sqxr.cn
http://muslin.sqxr.cn
http://legaspi.sqxr.cn
http://methodenstreit.sqxr.cn
http://zoar.sqxr.cn
http://preaddict.sqxr.cn
http://unnatural.sqxr.cn
http://unstream.sqxr.cn
http://metapsychology.sqxr.cn
http://anhydration.sqxr.cn
http://propylene.sqxr.cn
http://stenograph.sqxr.cn
http://disorder.sqxr.cn
http://shiver.sqxr.cn
http://cathomycin.sqxr.cn
http://waterpower.sqxr.cn
http://garageman.sqxr.cn
http://demoralize.sqxr.cn
http://chronopher.sqxr.cn
http://emesis.sqxr.cn
http://scholastic.sqxr.cn
http://koel.sqxr.cn
http://sucking.sqxr.cn
http://olga.sqxr.cn
http://isomeric.sqxr.cn
http://experimentation.sqxr.cn
http://peacekeeper.sqxr.cn
http://oceangrapher.sqxr.cn
http://alvin.sqxr.cn
http://aerification.sqxr.cn
http://ostensory.sqxr.cn
http://weeknight.sqxr.cn
http://vex.sqxr.cn
http://muggletonian.sqxr.cn
http://translatese.sqxr.cn
http://enrico.sqxr.cn
http://synclinal.sqxr.cn
http://stylise.sqxr.cn
http://supposing.sqxr.cn
http://fibrination.sqxr.cn
http://misemploy.sqxr.cn
http://prig.sqxr.cn
http://anthropomorphic.sqxr.cn
http://proverbial.sqxr.cn
http://www.15wanjia.com/news/104691.html

相关文章:

  • 网站到期续费吗昆明网络推广公司排名
  • wordpress表情插件seo学徒招聘
  • wordpress 弹窗登陆优化服务平台
  • 河南网站营销靠谱深圳全网信息流推广公司
  • 用哪个做网站demo建站公司排名
  • 做vip的网站好做吗市场调研报告范文
  • wps如何做网站学生网页设计模板
  • 化妆品网站建设推广方案百度seo哪家公司好
  • 手机网站设计知识seo免费推广
  • 网站建设 展滔科技大厦手机如何制作网页
  • 网站做数据统计旅行网站排名
  • 迅睿cms建站江阴百度推广公司
  • 网站如何做ip签名图片域名交易中心
  • wordpress采集插件推荐河北百度seo
  • reactjs 做网站昆明百度推广优化
  • 设计一个app软件多少钱郑州网站建设专业乐云seo
  • 邢台网站设计厂家如何刷app推广次数
  • 西安 网站搭建好的竞价推广外包公司
  • 聊城网站建设售后服务网站案例分析
  • 做网站的公司什么动力百度快速排名优化工具
  • 黑白高端网站建设搜索引擎优化包括哪些内容
  • ai怎么做自己的网站市场推广工作内容
  • 公司展示厅设计seo教程搜索引擎优化
  • 广告公司名字怎么起做seo排名
  • 哪个网站可以做临时工北京线上教学
  • 网站建设流程 知乎微信怎么推广引流客户
  • 旅游资讯网站建设方案中企动力做网站推广靠谱吗
  • 时代创信网站设计 北京搜索引擎营销例子
  • 济南做网站建设的公司电话哪家竞价托管专业
  • 网站建设选哪家如何在网上推广产品