继承(inheritance)的最重要的性质之一就是:你可以通过“指向 base class objects”的pointer 或references 来操作derived class objects,如此的pointers 和references我们说其行为是多态的。
C++语言规范中说,通过base class 指针删除一个由derived classes objects构成的数组,其结果未定义。
总结:
多态(polymorphism)和指针算术不能混用,数组对象几乎总是会涉及指针的算术运算,所以数组和多态不要混用。
/***************************
more effectivre c++
35个改善编程与设计的有效方法
条款3:绝对不要以多态的方式处理数组
---------小鱼号的代码日记--------------
****************************/
/*********************************
继承(inheritance)的最重要的性质之一就是:
你可以通过“指向 base class objects”的pointer 或references
来操作derived class objects,
如此的pointers 和references我们说其行为是多态的。
**********************************/
#include<iostream>
using namespace std;
class BST{
public:
BST():
m_num(0){}
BST(int num):
m_num(num){}
friend ostream &operator<<( ostream &output,
const BST &bst )
{
output << "BST num : " << bst.m_num << endl;
return output;
}
private:
int m_num;
};
class BalancedBST:public BST
{
private:
int m_bNum;
};
void printBSTArray(ostream &s, const BST array[],int numElements)
{
for(int i = 0; i < numElements; i++)
{
s << array[i];
}
}
/*********************************
array[i] 其实是“一个指针算术表达式”的简写
代表 *(array + i)
array指向数组的起始处
array 和array + i 在内容中相差 i * sizeof(数组中的对象)
****************************/
void deleteArray(ostream &logStream,BST array[])
{
logStream <<" Deleting array at address "
<< static_cast<void*>(array) << "\n";
delete [] array;
}
int main()
{
BST BSTArray[10];
printBSTArray(cout,BSTArray,10); //运行良好
BalancedBST bBSTArray[10];
printBSTArray(cout,bBSTArray,10); //正常运行??
/*******************************
由于sizeof(bBSTArray)通常比sizeof(BST)大
所以便会出现不可预期的结果
*****************************/
deleteArray(cout,BSTArray);
///deleteArray(cout,bBSTArray);//正常运行??
return 0;
}
/*****************************************
C++语言规范中说,通过base class 指针删除一个
由derived classes objects构成的数组,其结果未定义。
多态(polymorphism)和指针算术不能混用,
数组对象几乎总是会涉及指针的算术运算,
所以数组和多态不要混用。
*********************************/
内容选自:
more effectivre c++
35个改善编程与设计的有效方法
网友评论