2021-04-27

继承时的注意事项

关于继承要注意的点:
(1)当用户声明了带参的构造函数时,系统不再提供默认的构造函数。所以在派生类中可能出现调用基类默认构造函数失效。出题

(2)聚合与组合的关系:聚合是较弱的关联(部分的生存期不同与整体的生存期),组合是较强的聚合(部分与整体共生、共灭)。
聚合在程序上表现,一般以成员 指针的形式构成整体类,当整体类的对象构造时,作为部分成员的对象不一定构造;当整体对象撤销时,作为部分的对象也一定撤销。
组合在程序上表现,一般以成员对象的形式构成整体类,当整体类的对象构造时,作为部分成员的对象也构造;当整体对象撤销时,部分对象也撤销。

(3)引用(变量别名)与变量名类似,指向固定的地址,虽然值可以变,但地址不可以变。但引用必须初始化,而且不能初始化为NULL。

(4)在多层继承中,一般继承:最派生类中只有直接基类中的成员,不会再有高层基类的成员(虽然形式上可以用高层基类作用域修饰符调用,但仅仅是因为类型兼容,实际所指的还是直接基类中的成员,多继承时使用还会有二义性的问题);除非是保持唯一性的虚基类,形式上直接、间接基类限定符,都是指向唯一的高层类的成员。

(5)因为虚基类的含义就是直接基类中的指针指向高层共同基类中的同一单元,所以本质上就是浅拷贝。会有副作用出现吗?
是否会delete直接基类的指针所指对象卸载时,造成高层基类被卸载?(会,不同大小类型的指针卸载的不一致性。)
非法访问:会用其他标识符,改变另一成员变量的值;
创建:能用直接基类生成对象吗?(对象中的成员也是虚的吗?)单独复制直接基类成员?赋值=?
虚基类解决继承中的二义性问题,中间层继承成员相当于基类成员的指针(允许重定义吗?同名覆盖)。

7.8.3 类型转换:父指子、子指父,只讨论公有继承:接口不变。
(6.1)继承中的父指子(将子类指针父赋给父类),通常是类型兼容(隐含转换,访问大的对象中小的基类部分),实现了联合的位域式访问(可用不同指针访问不同部分)。但在多继承中因为有二义性问题,不允许将子类对象指针赋给上面间接基类指针(因为其中有两套基类中的成员)。
虚基类的情况下,因为虚基类消除冗余解决了二义性问题,所以可以子转父。

(6.2)继承中的子指父(将父类指针或引用赋给子类),通常编译器默认不通过(将小的类型赋给大的类型,语义上不合理)。
但是通过static_cast<>()显式类型转换可以实现直接基类指针父转子,但对多继承用static_cast不能实现间接基类指针父转子,因为二义性;
在虚基类的情况下,虚基类都不允许用static_cast<>()赋值给直接或间接子类,因为是基类是虚的,但其中不为虚基类的子类可以用static_cast<>()转换赋值给最类。
但以上情况的父类指针都只能访问自己类型中的合法成员。继承中的父指子为实现多态打下基础,但没有虚函数还无法实现多态。

(6.3)继承中的对象,父指子,一般子类对象可以赋给父类对象(大给小),但多继承因为二义性问题,会不允许子类对象赋给上面间接基类对象;但虚基类的情况下,可以。
子指父(小给大),通过static_cast<>()显式类型转换可以实现基类对象转子对象时,会调用子类的相应构造函数和=运算符重载实现转换(需要自己定义实现)。但对多继承用static_cast不能实现间接基类指针父转子,因为二义性;

void指针参与的转换,兼容性规则不适用

造成混乱的根源是指针的类型转换、多继承产生的二义性,及虚继承的加入;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值