【C++】赋值兼容规则,拷贝构造函数、赋值语句在继承时的关系

1.切片现象

构建ps对象,有id号,姓名
构建s对象,由两部分构成,第一部分是school,第二部分是隐藏的父对象(id号,姓名)
当要把s对象给给ps时,不可能把s的所有空间放过去。只把隐藏的父对象给ps对象赋值。
在这里插入图片描述

2.赋值兼容规则

在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则

  1. 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的隐藏对象赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。(如上图)

  2. 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的隐藏对象,不能访问派生类中的新成员。同样也不能反过来做。
    (s的地址可以赋给p,但是p只能访问“090111”“yhp")
    在这里插入图片描述

  3. 派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的隐藏对象。

3.学生指针指向父,会报错,但是强转后编译器可以编译通过
下图sp->Print() 会发生什么情况?
在这里插入图片描述
程序崩溃-》调动父对象的school,父对象没有school,字符串应 存放在堆区,越界没有堆区 程序崩溃
如果school是int型-》乱码

拷贝构造函数在继承时的关系

1.父子都没有拷贝构造函数
抓住两个子对象的地址,按位拷贝,能把base1的内容完全拷贝给base2

2.父类型写了拷贝构造,子无
合成的拷贝构造函数既可以调用父,也可以调用子
能把base1的内容完全拷贝给base2
在这里插入图片描述
(父的拷贝构造函数)

3.父类型没有写拷贝构造,子写了拷贝构造
合成的拷贝构造函数不可以调用父

4.父子都写拷贝构造
拷贝构造的维护就交给程序人员,很麻烦:当base1构建base2时,调动base的拷贝构造函数,先构建父对象,系统默认调动缺省构造函数而没有调动父对象的拷贝构造函数,
必须明确告知,调动父类的拷贝构造函数。(如下图)否则系统会默认调动缺省构造函数
在这里插入图片描述
原则
如果设计一个类型的时候,并没有动态申请空间,不需要外部资源,就不要写拷贝构造函数,系统的拷贝构造函数足以应付
如果需要外部资源,空间,就要把父子类的拷贝构造函数写进去,并且明确告知子类的拷贝构造要调动父类的拷贝构造函数

赋值语句在继承时的关系

1.父子都缺省赋值语句
缺省赋值,把base2 和 base1的地址抓住,按位赋值

2.父类型写了赋值语句,子类型没有
子类型合成了一个赋值语句,可以调动父的

3.父没有赋值语句,子有
可以合成了一个赋值语句,赋值都可以进行

4.父子都写了赋值语句
必须显示说明子的赋值语句调动父的赋值语句,如果没有显示,没有办法调动父对象的赋值语句
在这里插入图片描述

为什么在C++中尽可能用参数列表方式初始化,而不是赋值?
如果是赋值,首先调动缺省构造函数,先构建成员对象obj,进入函数,x对obj赋值时,调动缺省构造函数,创建临时对象x对obj进行赋值,赋值完临时对象销毁

如果在参数列表调动构造函数,构造obj的同时就初始化了,参数列表效率高。

初始化与赋值区别:初始化生来就是百万富翁,赋值后天。。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值