–本文来自侯捷老师的课程和自己的理解形成的笔记
若有错误,欢迎指出
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就成重写了)