本文预览:
OOP(面向对象编程)不是只有继承这一种关系,还包括组合和委托,虽然这两种关系非常简单,委托的另一个别名叫做Composition by reference,两者在形式上是非常相似的。
- 组合(Composition)
- 委托(Delagation)
- 继承(Inheritance)
- 继承下的构造和析构
- 继承与虚函数
- 虚函数的重要应用 Template Method
组合关系,表示has-a
- deque是queue的成员,queue和deque是组合关系。组合关系的类大小的计算:
- 组合关系的构造与析构
构造函数顺序是先构造component,再构造自己;
析构函数刚好相反,先析构自己,然后在析构component。
委托(Delagation), Composition by reference
类里面明明是个指针,非要写成是 by reference, 只是个叫法的问题吧,c++好像很少用 by pointer的说法,reference尤其是参数传递和返回值的时候最常用。
String现在的实现完全交付给StringRep来实现,并且,不像Composition那样,生命周期是一致的,现在String和StringRep的生命周期就不再一致。这种设计的一个用处在于,String对外提供的接口使用是不变的,但是内部实现是可以更换的;还有引入reference counting,效率岂不是比起来char*快更多倍,尤其是在不需要改变的字符串常亮。
继承(Inheritance),表示 is-a
继承是面向对象编程的核心部分,从内存的角度上讲,子类拥有父类的成员变量,对于成员函数来说,继承代表子类拥有函数的调用权
- 继承的语法
- 继承下的构造和析构
有两点是需要注意的吧:
- 构造和析构的顺序,这些都是编译器自动调用的,红色部分标记的位置;
- 父类的析构函数一定设计成是虚函数。
- 继承和虚函数
三个非常重要的函数
- 非虚函数: 不希望子类重新定义
- 虚函数:希望子类重新定义,并且自己有默认定义
- 纯虚函数:子类一定要重新定义,自己没默认定义
- 虚函数最常见且重要的应用领域:Template Method
子类调用父类的函数,父类延缓实现Serialize()方法,交由子类来实现,在调用的时候,执行子类的方法。
Template Method 常常用在框架的设计,具体实现由谁来写都是一样的,但是必须按照这种框架来实现。