ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

More Effective C++:条款3:绝对不要以多态的方式处理数组

2021-08-01 16:05:28  阅读:146  来源: 互联网

标签:Effective BST 多态 C++ int 数组 基类 array 指针


继承很重要的一个性质是

可以通过指向基类的指针/引用操作衍生类

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();
}

指针删除过程中会出现类似的未定义行为
总结

多态和指针算术不能混用(常见数组)

标签:Effective,BST,多态,C++,int,数组,基类,array,指针
来源: https://blog.csdn.net/qq_49735865/article/details/119298554

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有