C++面向对象程序设计(上)第三周学习笔记——Boolan

在完成了C++面向对象高级编程(上)第三周的学习之后,有一些总结和心得在这里通过学习笔记的方式分享出来,供也在学习C++的小伙伴用作学习交流,如有理解不到位的地方,欢迎批评指正。

本周学习了Object Oriented Programming(OOP),Object Oriented Design(OOD),其实也就是类与类之间的关系。类与类之间有以下三种关系:

Composition(复合)

Delegation(委托)

Inheritance(继承)

一.Composition(复合)

复合表示一种包含关系,即has-a,可以用下图形象的表示:


C++面向对象程序设计(上)第三周学习笔记——Boolan_第1张图片

Container容纳了component,即拥有component中的功能,复合关系下的构造由内而外,析构则由外内,当然,这是由编译器去自动完成的,并且,两个类的生命周期是一致的。

二.Delegation(委托)

我觉得复合和委托的区别就在于前者包含的是类本身,而后者则包含的是类的指针,所以委托其实也是一种复合,是component by reference,可以用下图表示:


当String需要的时候就会通过指针调用StringRep中的函数。但与复合不同的是,String对象会先被创建,等需要的时候再创建StringRep对象。功能的设计体现在StringRep中,而String只是实现了一个接口,那么,当我们需要改动的时候,只需要改动StringRep,不需要动String,这样就形成了编译防火墙,这也就是Handle/Body(pImpl)的设计模式。这样,a、b、c不同的接口都可以指向同一个object,大大节省了内存。


C++面向对象程序设计(上)第三周学习笔记——Boolan_第2张图片

三.Inheritance(继承)

继承是一种父与子的关系,即is-a。子类对象可以使用父类对象中的数据调用父类对象的函数,如下图所示:


C++面向对象程序设计(上)第三周学习笔记——Boolan_第3张图片

构造和析构的原理也跟复合关系一样,构造由内而外,析构由外而内。


C++面向对象程序设计(上)第三周学习笔记——Boolan_第4张图片

继承通常是搭配virtual function(虚函数)来使用,在语法上只要在成员函数之前加上virtual就是虚函数了。下面例子中的pure virtual是不会在父类中定义的,要求子类必须重新定义,即复写(override,这是一个专有名词,只能在虚函数被重新定义时使用);impure virtual是在父类中有默认定义,子类中可以override;non-virtual在父类中已经定义了,并且不希望子类去override。


C++面向对象程序设计(上)第三周学习笔记——Boolan_第5张图片

四.三种关系的组合

1.Inheritance(继承)+ composition(复合)


C++面向对象程序设计(上)第三周学习笔记——Boolan_第6张图片

对于第二种关系的构造和析构,按照内外的原则,很明显构造是先component,再父类,最后子类,析构则相反,由外而内,这很好理解;至于第一种,我认为父类和子类中的包含部分其实可以看成是并列关系,编译器如何去安排构造和析构的顺序,对程序本身没有什么影响。

2.Delegation(委托)+ inheritance(继承)


C++面向对象程序设计(上)第三周学习笔记——Boolan_第7张图片

老师举了一个多窗口查看文件的例子。文件或者数据跟各个窗口之间是委托的关系,窗口可以写成虚函数,让子函数去复写具体窗口的内容如何实现。

�ZZZ������

你可能感兴趣的:(C++面向对象程序设计(上)第三周学习笔记——Boolan)