14.6.3 隐藏向量式new和delete
一种可能的做法是通过在基类中隐藏向量式new和delete(即operator new[ ]()和operator delete[ ]())来影响其派生类在数组方面表现出来的特征:
- class Base
- {
- std::string s;
- private:
- void *operator new [](size_t);
- void operator delete [](void *);
- };
-
- int main()
- {
- Base *pbs = new Base[5]; // 非法 - 不方便!
- Derived *pds = new Derived[5]; // 非法 - 很好!
- Base ab[5]; // 仍然合法 - 很好!
- Derived ad[5]; // 仍然合法 - 糟糕!
- . . .
隐藏向量式new和delete操作符的做法只能够禁止从堆上分配数组,却无法阻止别人声明派生类实例的基于栈的数组,并将它传递给一个期望父类实例数组的函数。
此外,没有任何手段能够阻止派生类的作者提供公共的(public)可访问的向量式new和delete。因此,这种方案的主要效用是阻止人们创建基于堆的Base数组。由于它并没有能够阻止我们想要避免的东西,所以这种方案简直毫无用处!