C++ 标准提供了不少容器类,这些为C++的应用提供了很大的便利。但是,总有些时候这些标准容器提供的功能不能完全满足需求,于是就有人从标准容器上继承出了自己的类。
那么,标准容器可以用作基类吗?
先说结论吧,不推荐,不要用。
为什么呢?
标准中所用的容器类都没有虚的析构函数。
没有虚析构就意味着这些类并不准备被用于继承。因为当基类没有虚析构的时候,子类的对象有可能不能被正确的析构。比如说,将子类的指针转换为基类的指针,在对基类指针调用 delete 的时候,如果基类的析构函数不是虚的,那么子类的析构函数将不会被调用。这是不推荐将标准容器作为基类的最主要的原因。
可是我真的想扩充标准容器的功能啊?
两个方案:
1. 对于基于标准容器的算法,可以不基于某一种容器扩展,而是写成接受 iterator 的算法。
这个在 <algorithm>
里有不少例子,可以参考。(其实,看看 <algorithm>
你可能就已经发现你想扩充的算法了)简单的增加一个算法都可以使用这种方案。
基于 iterator
的算法具有通用性,可以不只应用与某一个容器,复用性好,何乐而不为呢。
2. 将标准容器作为类成员。
如果你的类需要一些额外的数据成员,那这就是一个比较好的方案了。