【C++】面向对象高级编程(3):类与类之间的关系

–本文来自侯捷老师的课程和自己的理解形成的笔记

若有错误,欢迎指出

C++类和类之间,在侯捷老师的课程中,一般被分为三种关系

复合关系、委托关系和继承关系

复合关系:指类中包含另一些类

比如STL里面我们说过,queue类里面包含一个底层容器类deque,用图的表现形式可以如下:
在这里插入图片描述
符合关系下的内存,需要将其含有的类也拆开去计算。在这里插入图片描述
复合关系下的构造与析构:
这三种类型都只用记住一句话:
构造由内向外,析构由外向内。
在这里插入图片描述

委托关系:类A中有类B的指针,可以随时调用B。

既然使用了指针,代表A和B的生命周期是不同步的。
表现形式如下:
在这里插入图片描述
委托类最重要的作用在于:
可以让接口和实现分离,方便于根据不同需要切换不同版本的实现。

除此之外,在上图的设计模式中需要注意,假如a需要更改Hello的值,则只会提供副本供其修改。

继承关系:表示B是一种A

在这里插入图片描述
有三种继承方式,public,private,protected
public继承:父类的protected,public成员在子类中不发生变化。
protected继承:父类的protected,public成员在子类中的属性降为proteced
private继承:父类的protected,public成员在子类中降为private

注意,继承对于函数的继承更像是调用权的继承,而不是内存的角度去分析。

继承关系下的构造和析构函数和复合关系下的相同:
构造由内而外,析构由外而内。
在这里插入图片描述
同时,基类函数的析构函数一定要是虚函数的原因是:在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。

关于虚函数:
在这里插入图片描述
此外,我们需要分清楚重载(overload),重写(overried),重定义(redefining)的区别:

重载(overload):重载是一个类里面的一个函数,根据传入参数的不同,而实现的不同版本。

重写(override):也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态。

重定义(redefining):也叫隐藏,子类重新定义父类中有相同名称的非虚函数,参数列表可以相同可以不同,会覆盖其父类的方法,未体现多态。
a如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
b如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。(如果有virtual就成重写了)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值