More Effective C++ 学习笔记(3)

原创 2015年11月18日 17:06:46

条款3 绝对不要以多态方式处理数组


所谓多态方式,就是基类指针(引用)指向派生类对象的方式。多态是运行时行为,绑定在运行时决定,虚函数的实现靠RTTI机制。

然而,这个条款中所说的数组,就是常量指针配合[]操作符的用法。除非是重载了[]操作符,这个操作,对于编译器来说会解析为偏移量的问题。例如A[i],就等价于*(A+i),也就是从A指针的位置移动i个对象的位置。而这里的对象,由于是在编译时,编译器是无法知晓对象会是什么类型,只能是基于指针的类型,如果是多态的,也就是基类指针。这样,A[i]指向的地址就按照基类对象的大小来移动,但子类的对象往往会比基类大,这样就会出现地址错位的情况,轻则逻辑错误,重则直接挂掉。

类似的,delete []p,如果p是多态的,会有同样的问题。

More Effective C++学习笔记(4)-效率

主题 概要 C++ More Effective C++ 效率 编辑 时间 新建 20170121 序号 参考资料 1 More ef...

More Effective C++学习笔记(2)-运算符

主题 概要 C++ More Effective C++ 运算符 编辑 时间 新建 20170108 序号 参考资料 1 More e...

More Effective C++学习笔记(5)-技巧

主题 概要 C++ More Effective C++ 技巧 编辑 时间 新建 20170121 序号 参考资料 1 More ef...

《Effective C++》学习笔记(1~3)

《Effective C++》学习笔记(1~3) 导读 explicit关键字修饰构造函数,禁止隐式类型转换; Widget w1 = w0; //等号语法在此起到调用拷贝构造函数的作用,而不...

More Effective C++总结(3):异常

条款9: 使用析构函数防止资源泄漏 下面代码会产生的问题:pa->processAdoption()可能抛出异常,导致delete不被执行 void processAdoption(istream...
  • rommi
  • rommi
  • 2011年09月20日 15:31
  • 654

more effective c++之Item M3:不要对数组使用多态

不要对数据使用多态,因为基类和派生类的对象大小不同,导致执行数组指针前移和后移等操作时对象跨度不同会出问题; 类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有...

《more effective c++》Item M3:不要对数组使用多态

类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为...

More Effective C++读书笔记(五)

技术 条款25:将构造函数和非成员函数虚拟化 1.虚拟构造函数是指能够根据输入给它的数据的不同而建立不同类型的对象,比如从磁盘读取对象信息。 2.被派生类重定义的虚拟函数不用必须与基类的虚拟函数...
  • necrazy
  • necrazy
  • 2013年11月08日 10:11
  • 815

【more effective c++读书笔记】【第5章】技术(2)——限制某个class所能产生的对象数量

一、允许零个对象 每当产生一个对象时会有一个构造函数被调用,因此阻止某个类产出对象的最简单方法就是将该类的构造函数声明为private。 例子: class CantBeInstantiated{ p...

【more effective c++读书笔记】【第3章】异常(2)

条款12:了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异 2、例子: istream operator>>(istream& s, Widget& w); void...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:More Effective C++ 学习笔记(3)
举报原因:
原因补充:

(最多只允许输入30个字)