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

东莞产品网站建设公司南京网站设计优化公司

东莞产品网站建设公司,南京网站设计优化公司,网站的内链优化怎样做,云建站微网站目录 一,菱形继承 1.1单继承 1.2多继承 1.3菱形继承 1.4菱形继承的问题 1.5虚拟继承解决数据冗余和二义性的原理 二.继承的总结和反思 一,菱形继承 C三大特性——继承-CSDN博客 1.1单继承 单继承:一个子类只有一个直接父类时称这个继…

目录

一,菱形继承

1.1单继承

1.2多继承

1.3菱形继承

1.4菱形继承的问题

1.5虚拟继承解决数据冗余和二义性的原理

二.继承的总结和反思


一,菱形继承

C++三大特性——继承-CSDN博客

1.1单继承

单继承:一个子类只有一个直接父类时称这个继承关系为单继承

1.2多继承

多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承

1.3菱形继承

菱形继承:菱形继承是多继承的一种特殊情况

1.4菱形继承的问题

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。

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";
}

虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和Teacher的继承Person时使用虚拟继承,即可解决问题。需要注意的是,虚拟继承不要在其他地方去使用

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";
}

1.5虚拟继承解决数据冗余和二义性的原理

为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成员的模型。

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;
}

下图是菱形继承的内存对象成员模型:这里可以看到数据冗余

下图是菱形虚拟继承的内存对象成员模型:这里可以分析出D对象中将A放到的了对象组成的最下面,这个A同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A

// 有人可能会有疑问为什么D中B和C部分要去找属于自己的A?那么大家看看当下面的赋值发生时,d是不是
要去找出B/C成员中的A才能赋值过去?
D d;
B b = d;
C c = d;

下面是上面的Person关系菱形虚拟继承的原理解释:

二.继承的总结和反思

1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。


2. 多继承可以认为是C++的缺陷之一,很多后来的语言都没有多继承,如Java

http://www.hengruixuexiao.com/news/32453.html

相关文章:

  • wordpress微信公众号关注福建网络seo关键词优化教程
  • 蓝色的包装材料企业网站模板建站软件
  • 简述如何对网站进行推广?今天最新新闻
  • 网站策划书免费爱站网关键词密度查询
  • wordpress什么插件好南宁哪里有seo推广厂家
  • cdr做网站分辨率重庆网站优化公司
  • 江苏省政府关于网站建设的通知重庆网站优化软件
  • 集团网站建设方案书查询关键词
  • 做品牌折扣的网站百度公司排名
  • wordpress批量删除图片抖音seo关键词排名技术
  • 可以自己做免费网站吗站长工具seo综合查询 分析
  • 杭州公司做网站客户引流推广方案
  • 做书的网站有哪些内容吗深圳网络营销技巧
  • dw用表格做网站搜索引擎营销方法主要有三种
  • 网站网页设计模板下载win10优化大师官网
  • 消防网站建设目标软件开发交易平台
  • 贵州城乡建设网站资源猫
  • 天津网站制作的公司个人免费建站系统
  • 做网站用c 还是php郑州千锋教育培训机构怎么样
  • 牡丹江市建设银行门户网站百度seo怎么操作
  • 福州专业网站制作黄石seo诊断
  • 外贸型网站百度手机助手下载安卓版
  • 做网站困难嘛百度网页
  • 运城住房和建设局网站百度seo课程
  • html5导航网站源码下载网站开发公司排行榜
  • 网站建设维护软文推广怎么写
  • 怎么设计网站页面淮北网站建设
  • 网站设计学习机构郑州百度网站优化排名
  • html table网站seo前景
  • 美国做电商网站有哪些网址安全中心检测