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后,子类要写自己析构,编译器在调用析构时是会先执行自己的析构,所以才能由外而内;

 

posted @ 2022-05-04 22:33  acwarming  阅读(164)  评论(0编辑  收藏  举报