C++中的多态是指通过基类型的指针或引用可以访问它们实际所指的派生类对象中的基类部分和派生类部分的虚函数,使得基类型指针或引用看上去有多种类型一样。有这样一个数组,装的是派生类对象,当然可以通过基类型的指针来访问这个数组,但是这样的后果往往是灾难性的,带来不可预计的结果。
class base{/*基类定义*/};
class derived:public:base{
/*派生类定义*/
};
void func(const base[],int num){
for(int i=0;i<num;i++)
cout<<base[i];//假设<<运算符已重载
}
int main(){
derived ary[5];
/*数组元素相应初始化*/
func(ary,5);
}
|
程序看上去没有什么问题,但结果却难以预料。
我们知道对于数组元素ary[i],编译器是通过地址ary+i*(sizeof(数组元素))来访问的,声明的基类型数组元素,即基类型对象大小,即其sizeof值和实参的派生类对象大小几乎不可能是一样的,就是说编译器还按照ary+i*(sizeof(基类对象))来遍历访问数组是不正确的,但却不会报错。
使用抽象类作为基类某种程度能避免类似问题,在我们设计类层次结构的时候谨记不要让一个concrete class(具体类?)从另一个concrete class派生,应该使用抽象类(abstract class)。
数组的使用是和指针运算紧密结合的,而指针运算和多态几乎是不相容的,所以永远不要运用数组多态。
阅读(651) | 评论(0) | 转发(0) |