More Effective C++:条款3:绝对不要以多态的方式处理数组
2021/8/1 17:37:22
本文主要是介绍More Effective C++:条款3:绝对不要以多态的方式处理数组,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
继承很重要的一个性质是
可以通过指向基类的指针/引用操作衍生类
C++也允许通过基类的指针操作衍生类的数组,但是操作的结果几乎不会按照预期进行。
打印BST数组中所有内容 void printBSTArray(ostream& s,const BST array[],int num){ for(int i =0; i < num; ++i){ s << array[i]; } } 调用 BST BSTArray[10]; printBSTArray(cout, BSTArray, 10); ↑基类 ↓衍生类 BalancedBST bBSTArray[10]; printBSTArray(cout, bBSTArray, 10);
上述的遍历循环中,array[i]的含义为*(array+i*sizeof(type))【指针算术表达式】
当数组类型由基类转变为衍生类时,type的大小很有可能会发生变化
但是编译器依然按照BST类型开辟空间
运行结果不可估计,没有预期
删除操作也是很需要注意的
当你试图通过基类指针删除由衍生类组成的数组时
void deleteArray(ostream& s, BST array[]){ s << "删除元素地址" << static_cast<void*>(array) << '\n'; delete[] array; } BalancedBST* balancedArray = new BalancedBST[50]; deleteArray(cout, balancedArray);
虽然没有出现指针算术表达式,但是当数组被删除,数组中每一个元素的析构函数都将被调用,当看到delete[] array
会产生如下代码
for(int i = 元素数量-1; i >= 0; --i){ array[i].BST::~BST(); }
指针删除过程中会出现类似的未定义行为
总结
多态和指针算术不能混用(常见数组)
这篇关于More Effective C++:条款3:绝对不要以多态的方式处理数组的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享
- 2024-12-22el-tabs 组件只被引用了一次,但有时会渲染两次是什么原因?-icode9专业技术文章分享
- 2024-12-22wordpress有哪些好的安全插件?-icode9专业技术文章分享
- 2024-12-22wordpress如何查看系统有哪些cron任务?-icode9专业技术文章分享
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解