菱形继承和C++相关问题
创始人
2025-05-30 04:57:57
0

菱形继承和C++相关问题

  • 菱形继承
  • 继承中的同名问题
  • 重载加常量情况
  • 委托构造

菱形继承

菱形继承是因为多继承存在问题而存在的
在这里插入图片描述
像这样都是a的话出现二义性,要采用virtual继承,所以菱形继承它也叫虚继承。

#include
#includeusing namespace std;class A
{
public:A(int a) : a(a){}
protected:int a = 555;
};class B : public A
{
public:B(int a):A(a){}};class C : public A
{
public:C(int a): A(a){}
};class D : public B, public C
{
public:D(int a): B(90), C(68) {}void print(){cout << A::a << endl;cout << B::a << endl;cout << C::a << endl;}
};int main()
{D d(10);d.print();system("pause");return 0;
}

在这里插入图片描述

如结果所示,存在二义性问题,这a应该都是一个值,采用virtual继承的方式来解决

在B,C的继承方式前加个virtual,这样子类就必须调用爷爷的构造函数


#include
#include

using namespace std;

class A
{
public:
A(int a) : a(a){}
protected:
int a = 555;
};

class B : virtual public A
{
public:
B(int a):A(a){}

};

class C : virtual public A
{
public:
C(int a): A(a){}
};

class D : public B, public C
{
public:
D(int a): B(90), C(68),A(a) {}
void print()
{
cout << A::a << endl;
cout << B::a << endl;
cout << C::a << endl;
}
};

int main()
{
D d(10);

d.print();system("pause");
return 0;

}

在这里插入图片描述

如图所示,打印的结果都是10,这样就不存在二义性问题了

继承中的同名问题

就2种
1.数据成员同名
2.函数同名

在对象的访问中:
如果不加以修饰,那么按照就近原则,
如果用类名限定了,那么自然就调用那类中的
用指针访问时候
注意的是:可以用父类的指针,对子类对象进行初始化,但不能用子类的指针对父类初始化
1.如果不加以修饰,那么调用的,取决于指针的类型,如果是父类的指针类型,那么肯定就调用父类的。

#include
#includeusing namespace std;class father
{
public:father(){}father(string name):name(name){}protected:string name;
};class son : public father
{
public:son(){}son(string name1, string name2) :father("father"){this->name = "son";}void print(){cout << son :: name << endl;cout << father::name << endl;}
protected:string name;};int main()
{son m;m.print();father* p = new son;p->print();system("pause");return 0;
}

在这里插入图片描述

如果所示,这里是父类的指针类型,只能调用父类的东西,调用了子类的东西,编译器自然就报错了。

重载加常量情况

主要是: 有个MM类,它的对象为mm
1.mm = mm + 1
2.mm = 1 + mm

运算符重载的使用情况

#include
#includeusing namespace std;class MM
{
public:MM(int date) : date(date) {}MM operator + (int m){this->date = this->date + m;return *this;}void print(){cout << date << endl;}
private:int date;
};int main()
{MM mm(1);mm = mm + 1;  // 采用的函数运算符重载 , 实质是:  mm.成员函数()mm = 1 + mm; // 报错的原因是  1.成员函数()  1无法完成这种转化mm.print();system("pause");return 0;}

在这里插入图片描述

解决这一问题的方法:就是要使用友元函数的运算符重载

#include
#includeusing namespace std;class MM
{
public:MM(int date) : date(date) {}/*MM operator + (int m){this->date = this->date + m;return *this;}*/friend MM operator + (MM  date1,MM date2){return MM(date1.date + date2.date);}void print(){cout << date << endl;}
private:int date;
};int main()
{MM mm(1);mm = mm + 1;  // 采用的函数运算符重载 , 实质是:  mm.成员函数()mm = 1 + mm; // 报错的原因是  1.成员函数()  1无法完成这种转化//使用友元函数重载,来解决这一问题mm.print();system("pause");return 0;}

委托构造

构造委托也叫做委托构造,它能够允许有一个构造函数调用另外一个构造函数
它只能采用初始化列表
c++中大部分情况,都需要初始化列表,所以建议,最好每次都是用初始化参数列表


#include
#includeusing namespace std;class MM
{
public:MM(): MM(10, "温柔了岁月") {}  //这就是委托构造,采用初始化列表MM(int age , string name) : age(age),name(name){}
private:int age;string name;
};
int main()
{system("pause");return  0;
}

相关内容

热门资讯

持续交付中的关键点 做持续交付就是提升整个研发体系效率的关键。持续交付覆盖了应用的整个生命周期,涉及产品、...
最新或2023(历届)昆明市民... 昆明市教育局关于做好最新或2023(历届)民办初中招生工作的通知各县区教育局,各国家级、省级开发(度...
最新或2023(历届)昆明小升... 11月28日,昆明市教育局发布了《关于做好最新或2023(历届)民办初中招生工作的通知》,备受关注的...
最新或2023(历届)昆明民办... 招生对象:具有昆明学籍的最新或2023(历届)小学应届毕业生;具有昆明户籍未在昆明就读的最新或202...
最新或2023(历届)石家庄各... 本报讯(记者 郭鹏)近日,一则“石家庄各区初中招生范围和学区房分布,家长必看”的微信在朋友圈里颇为流...
最新或2023(历届)昆明民办... 昆明市教育局对外公布关于做好最新或2023(历届)民办初中招生工作的通知,全市民办中学小升初实行网上...
ChatGPT4已经来了,30... 前两周写了关于ChatGPT的文章,折腾了一晚!终于开通了ChatGPT...
【Spring从成神到升仙系列... 👏作者简介:大家好,我是爱敲代码的小黄,独...
最新或2023(历届)广州小升... 最新或2023(历届)1、2月开始寒假复习,重视寒假复习,备战3月的华杯赛及希望杯竞赛备考杯赛冲刺阶...
QT 如何提高 Qt Crea... 如何提高编译速度,貌似是一个老生常谈的话题。对于Qter而言,如何提高Q...
最新或2023(历届)广州民校...   ■制图:王云涛与名校紧密挂钩的“华杯赛”参赛单位暂无广州,业内人士预测由机构承办赛事根据政策,明...
最新或2023(历届)昆明民办...   昆明新政  当民办初中学校的报名信息确认学生数大于最新或2023(历届)招生计划时,招生计划的5...
图解北京小升初一张图让你了解最...  图解北京小升初:一张图让你了解最新或2023(历届)北京小升初新政
昆明市教育局最新或2023(历... 昆明市教育局关于做好最新或2023(历届)民办初中招生工作的通知  各县区教育局,各国家级、省级开发...
最新或2023(历届)美丽的春... 冬去春来,杨柳吐绿,我盼望已久的春天来到了,我不禁欣喜若狂。春天来了,山变绿了,田野里的小草偷偷探出...
最新或2023(历届)昆明小升...  28日上午,昆明市教育局下发了《关于进一步做好昆明市义务教育阶段小学升初中工作的通知》,最新或20...
最新或2023(历届)月圆是画... 在五光十色的世界中,许多人都在为了忙碌而忙碌。乐此不疲之际,往往忽略了自己心中的追求。因此,在并非觉...
聚焦最新或2023(历届)北京...  西城区以史无前例、脱胎换骨的力度即将进行第二阶段的更深层教育改革。即便第二阶段的教改还没有通过官方...
Notes03:使用寄存器点亮... 使用寄存器点亮LED 目标 使用寄存器点亮LED_G 原理图 由原理图可知, LED_G阳极接3V...
最新或2023(历届)昆明小升...  28日上午,昆明市教育局下发了《关于进一步做好昆明市义务教育阶段小学升初中工作的通知》,最新或20...