因为这将降低类型系统的安全性。例如:
如果调用 f(v) 是合法的,我们将得到伪装成 Apple 的 Orange。
当然,也可以把语言设计成允许这种不安全的类型转换,然后依赖动态类型检查保证访问的合法性。这将导致每次访问 v 的成员时,都要进行运行时检查,而且 h() 也必须在遇到 v 的最后一个元素后抛出异常。
相关文章:
- 在operator=中对所有数据成员赋值
- 说明了如果没写赋值运算符的话,编译器就会为你生成一个,条款11则说明了为什么你会经常不喜欢编译器为你生成的这个赋值运算符,所以你会想能否有个两全其美的办法,让编译器生成一个缺省的赋值运算符,然后可以有选择地重写不喜欢的部分。这是不可能的!只要想对赋值过程的某一个部分进行控制,就必须负责做赋值过程中所有的事。...
- 在operator=中检查给自己赋值的情况
- 如果b是a的另一个名字(例如,已被初始化为a的引用),那这也是对自己赋值, 虽然表面上看起来不象。这是别名的一个例子:同一个对象有两个以上的名字。在 本条款的最后将会看到,别名可以以大量任意形式的伪装出现,所以在写函数时一 定要时时考虑到它。...
- 为什么 “this” 不是引用
- 因为“this”被引入 C++(事实上那时还是带类的 C)的时候,还没有引用(reference)这个概念。同样地,遵循 Simula 的用法而选择了“this”这个词,而不是(后来)Smalltalk 的“self”。...
- 为何标准容器效率如此低下
- 不,它们的效率并不低下。或许“和什么比较?”会是一个更有用的回答。当人们抱怨标准库容器的性能时,通常会是以下三个现实问题之一:...
- i++ + i++ 的值是多少
- 未定义。基本上,无论 C 还是 C++,如果你在同一个表达式中两次读取同一个变量,并且还对该变量进行写操作,那么结果就是未定义的。...
- 尽量用new和delete而不用malloc和free
- malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。 假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new:...
- 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
- 这种情况下至少有两个问题。第一,b曾指向的内存永远不会被删除,因而会永远丢失。这是产生内存泄漏的典型例子。第二,现在a和b包含的指针指向同一个字符串,那么只要其中一个离开了它的生存空间,其析构函数就会删除掉另一个指针还指向的那块内存。...
- 分清成员函数非成员函数和友元函数
- 成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定,就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。...
- 如果不想使用隐式生成的函数就要显式地禁止它
- 假设想写一个类模板Array,它所生成的类除了可以进行上下限检查外,其它行为和C++标准数组一样。设计中面临的一个问题是怎么禁止掉Array对象之间的赋值操作,因为对标准C++数组来说赋值是不合法的:...
- 使公有继承体现 "是一个" 的含义
- 在"Some Must Watch While Some Must Sleep"( W. H. Freeman and Company, 1974)一书中,William Dement讲了一个故事,故事说的是他如何让学生们记住他的课程中最重要的部分。"据说,",他告诉他的学生,"一般的英国学生除了记得Hastings战役发生在1066年外,再也不记得其它历史。", "如果一个小孩不记得别的历史," Dement强调说,"也一定记得1066这个日子。" 但对于他班上的学生来说,只有很少一些话题可以引起他们的兴趣,比如,安眠药会引起失眠之类。所以他哀求他的学生,即使忘掉他在课堂上讲授的其它任何东西,也要记住那些仅有的几个重要的历史事件。而且,他在整个学期不停地对学生灌输这一基本观点...