因为这将降低类型系统的安全性。例如:
class Apple : public Fruit { void apple_fct(); /* ... */ };
class Orange : public Fruit { /* ... */ }; // Orange 没有 apple_fct()
vector<Apple*> v; // vector of Apples
void f(vector<Fruit*>& vf) // innocent Fruit manipulating function
{
vf.push_back(new Orange); // 将 Orange 对象指针加入 vf
}
void h()
{
f(v); // 错误:不能传递 vector 给 vector
for (int i=0; i<v.size(); ++i) v[i]->apple_fct();
}
如果调用 f(v) 是合法的,我们将得到伪装成 Apple 的 Orange。
当然,也可以把语言设计成允许这种不安全的类型转换,然后依赖动态类型检查保证访问的合法性。这将导致每次访问 v 的成员时,都要进行运行时检查,而且 h() 也必须在遇到 v 的最后一个元素后抛出异常。
原文地址:http://www.research.att.com/~bs/bs_faq2.html#conversion
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Bjarne Stroustrup 翻译:antigloss 共同所有,转载请注明原作者和出处。谢谢。