C++面向对象编程之复合、委托和继承
1.复合,表示has a
template <typename T> calss A{ protected: B<T> c; }
这里表示 A 里面有一个 B,A 可以调用 B 写好了的功能函数,B 里的东西可能更多更强大,A 只取其中一些用;
复合关系下的构造和析构:
1)构造是由内而外进行的,在上例中,A 的构造会先调用 B 的默认构造函数,再执行自己的。
2)析构是由外而内进行的,在上例中,A 会先执行自己的,再执行 B 的析构函数。
当然,调用 B 的构造和析构都是编译器自动进行的,不用我们自己写,如果在构造 B 时不想使用默认构造就需要自己写哪个构造函数;
2.委托
大致描述就是 A 类里有个指针指向 B 类,在 A 需要的时候就可以调用 B;
需要注意的是,委托和复合里都是有一个其他类,但是他们的生命期是不一致的:
1)复合是 A 和 B 一起构造,生命是一起出现
2)委托是 A 在需要使用 B 时,B的生命才开始,并不同步
在上图的例子中,String 类只是作为对外的接口,它的实际实现都是在右边的 StringRep类 中,也就是说,右边怎么变都不会影响到左边,这种手法叫编译防火墙;
左下角这个reference counting 是一种共享手法,如果其中有一个要修改需要新开一个空间,其他的还是在共享;
3.继承,表示 is a
继承关系下的构造和析构(这个与复合其实差不多):
1)构造是由内而外,子类先调用父类的构造函数,在执行自己
2)析构是由外而内,之类先执行自己,再调用父类析构函数
*注意:父类的析构函数必须是virtual,要不然就不会有析构是由外而内,这个侯捷还没仔细解释,现在按我自己理解就是,父类用析构用virtual后,子类要写自己析构,编译器在调用析构时是会先执行自己的析构,所以才能由外而内;