在完成了C++面向对象高级编程(上)第三周的学习之后,有一些总结和心得在这里通过学习笔记的方式分享出来,供也在学习C++的小伙伴用作学习交流,如有理解不到位的地方,欢迎批评指正。
本周学习了Object Oriented Programming(OOP),Object Oriented Design(OOD),其实也就是类与类之间的关系。类与类之间有以下三种关系:
Composition(复合)
Delegation(委托)
Inheritance(继承)
一.Composition(复合)
复合表示一种包含关系,即has-a,可以用下图形象的表示:
Container容纳了component,即拥有component中的功能,复合关系下的构造由内而外,析构则由外内,当然,这是由编译器去自动完成的,并且,两个类的生命周期是一致的。
二.Delegation(委托)
我觉得复合和委托的区别就在于前者包含的是类本身,而后者则包含的是类的指针,所以委托其实也是一种复合,是component by reference,可以用下图表示:
当String需要的时候就会通过指针调用StringRep中的函数。但与复合不同的是,String对象会先被创建,等需要的时候再创建StringRep对象。功能的设计体现在StringRep中,而String只是实现了一个接口,那么,当我们需要改动的时候,只需要改动StringRep,不需要动String,这样就形成了编译防火墙,这也就是Handle/Body(pImpl)的设计模式。这样,a、b、c不同的接口都可以指向同一个object,大大节省了内存。
三.Inheritance(继承)
继承是一种父与子的关系,即is-a。子类对象可以使用父类对象中的数据调用父类对象的函数,如下图所示:
构造和析构的原理也跟复合关系一样,构造由内而外,析构由外而内。
继承通常是搭配virtual function(虚函数)来使用,在语法上只要在成员函数之前加上virtual就是虚函数了。下面例子中的pure virtual是不会在父类中定义的,要求子类必须重新定义,即复写(override,这是一个专有名词,只能在虚函数被重新定义时使用);impure virtual是在父类中有默认定义,子类中可以override;non-virtual在父类中已经定义了,并且不希望子类去override。
四.三种关系的组合
1.Inheritance(继承)+ composition(复合)
对于第二种关系的构造和析构,按照内外的原则,很明显构造是先component,再父类,最后子类,析构则相反,由外而内,这很好理解;至于第一种,我认为父类和子类中的包含部分其实可以看成是并列关系,编译器如何去安排构造和析构的顺序,对程序本身没有什么影响。
2.Delegation(委托)+ inheritance(继承)
老师举了一个多窗口查看文件的例子。文件或者数据跟各个窗口之间是委托的关系,窗口可以写成虚函数,让子函数去复写具体窗口的内容如何实现。
�ZZZ������