本文以 C++ 为示例语言,但实际其中思想适用范围远大于 C++ 这一编程语言的范畴。
我们知道,C++ 标准模板类库提供了一系列的容器。诸如 std::vector<ElementType>
的容器需要在声明时指定容器中所储存的元素的类型。例如,我们可以使用 std::vector<int>
声明一个包含整型数字的变长数组;而 std::vector<std::string>
则可以用来声明一个包含 std::string
的变长数组。
显而易见,由于容器在声明时就已指定了其包含的元素的类型,容器内只能包含相同类型的元素。这与面向对象编程(Object-Oriented Programming, OOP, 使用继承和运行时动态绑定的编程方式)的思想似乎是矛盾的。因为 OOP 使用继承和动态绑定,允许程序员将相关但有不同的类的共性部分抽象成基类而将这些不同的部分分别作为子类独有的成员;若是容器内只能包含相同类型的元素,我们就无法直接在一个容器中包含同一个基类不同派生类的对象了——而在实际应用中,这种场景是存在的。
在前作中最后的示例(动物园的例子)中,我们通过保存基类指针(而不是对象本身)部分解决了这个问题。然而,在前例中,我们不可避免地还是需要使用 new
和 delete
来动态分配内存。此篇我们通过构建「代理类」来避免手工动态分配内存。