不要用多态方式处理数组

基类中重载运算符 <<;

有一个专用来处理基类对象的函数;

如果对这个函数传入的参数是单个对象,那么通常情况下这个函数可以接收基类对象,也可以接收派生类对象,这是C++的多态特性决定的;

但是如果这个函数处理的是对象数组,因为指针算数表达式的工作原理,这个函数只能用来处理基类对象数组,虽然在函数形式上也可以接收派生类对象数组,但是函数的处理结果是不可控的,因经过函数内部的指针运算后,指针指向的地址里的内容是不可控的。

验证函数如下:

#include<iostream>
//#include <ostream>
#include "BaseClass.h"
#include "DerivedClass.h"

void printBaseArray(std::ostream& s,const BaseClass array[],int numElement);

void main()
{
	BaseClass baseObj0(2,3);
	DerivedClass derivedObj3(1,2,3);
	BaseClass baseObj9(1,5);
	BaseClass baseArray[10];
	DerivedClass derivedArray[10];

	baseArray[0] = baseObj0;
	baseArray[3] = derivedObj3;
	baseArray[9] = baseObj9;

	derivedArray[0] = derivedObj3;
	derivedArray[3] = derivedObj3;
	derivedArray[9] = derivedObj3;
	
	std::cout << "**** baseArray ****" << std::endl;
	printBaseArray(std::cout,baseArray,10);
	std::cout << "\n**** derivedArray ****" << std::endl;
	printBaseArray(std::cout,derivedArray,10);		// build ok,but will get unexpected result

	getchar();
	return;
}

void printBaseArray(std::ostream &s, const BaseClass array[],int numElement)
{
	for (int iloop1 = 0; iloop1 < numElement;iloop1 ++)
	{
		s << "array" << iloop1 << ":   " << array[iloop1] << "\n";
	}
}

验证结果如下,通过观察验证结果,我们可以看到函数在处理基类对象数组时候,输出的结果如我们预想的一样,但是在处理派生类对象数组的时候,输出的结果却是与我们的期望相差很远,除了array0的那一行输出,这是因为这一步的时候函数还没有对数组指针进行操作。

其他文件中的代码如下

基类声明

#ifndef BASECLASS_H
#define BASECLASS_H
#include<iostream>
#include <ostream>


class BaseClass
	{
	public:
		BaseClass();
		BaseClass(int a,int b);
		~BaseClass();
		void FuncPub();
		friend std::ostream &operator<<(std::ostream & os,const BaseClass &bas);

	private:
		void FuncPri();

	private:
		int numA;
		int numB;

	};


#endif

基类实现

#include "BaseClass.h"


BaseClass::BaseClass()
{
	numA = 0;
	numB = 0;
}

BaseClass::BaseClass(int a,int b)
{
	numA = a;
	numB = b;
}

BaseClass::~BaseClass()
{

}

std::ostream &operator<<(std::ostream & os,const BaseClass &bas)
{
	os << "numA = " << bas.numA << ";  numB = " << bas.numB;
	return os;
}

void BaseClass::FuncPri()
{
	return;
}

void BaseClass::FuncPub()
{
	return;
}

派生类声明

#ifndef DERIVEDCLASS_H
#define DERIVEDCLASS_H
#include "BaseClass.h"

class DerivedClass : public BaseClass
{
public:
	DerivedClass();
	DerivedClass(int cd);
	DerivedClass(int ad,int bd,int cd);
	~DerivedClass();
	void DerivedClass::FuncPri2();

public:
	int numC;

};

#endif

派生类实现

#include "DerivedClass.h"

DerivedClass::DerivedClass():BaseClass()
{
	numC = 0;
}

DerivedClass::DerivedClass(int cd):BaseClass()
{
	numC = cd;
}

DerivedClass::DerivedClass(int ad,int bd,int cd):BaseClass(ad,bd)
{
	numC = cd;
}

DerivedClass::~DerivedClass()
{

}

void DerivedClass::FuncPri2()
{
	return;
}

猜你喜欢

转载自blog.csdn.net/ljl86400/article/details/97977791