禁止以多态的形式处理数组

#include<iostream>
using namespace std;

class BasedClass{        //基类

private:
    int num;
public:
    BasedClass() { this->num = 1; };
    BasedClass(int num) { this->num = num; };
    int getNum(){return num;};
};

class DerivedClass : public BasedClass{        //派生类

private:                                    
    int value;                //注意:派生类一般都会增加变量或函数,因此"体积"增大

};

ostream& operator << (ostream& out, BasedClass based)        //重载operator<<操作符

{
    out << based.getNum();
    return out;
}

void printArray(ostream& s, const BasedClass array[], int numElements){    //对基类对象数组进行打印输出

    for(int i = 0; i < numElements; i++)
        s << ' ' << array[i];
}

void main()
{
    cout << "print Based Array :";
    BasedClass basedArray[10];
    printArray(cout, basedArray, 10);        //对基类对象数组进行打印输出

    
    cout << endl;

    cout << "print Derive Array :";
    DerivedClass derivedArray[10];
    printArray(cout, derivedArray, 10);        //用同样的函数对派生类对象数组进行打印输出

    
    cout << endl;
}

运行结果:

print Based Array : 1 1 1 1 1 1 1 1 1 1
print Derive Array : 1 -858993460 1 -858993460 1 -858993460 1 -858993460 1 -858993460
Press any key to continue

    在printArray(ostream& s, const BasedClass array[], int numElements)函数中,array[i]是一个"指针算术表达式"的简写,它代表:*(array+i)。array所指内存和array+i地址相距i*sizeof(数组中的对象)。这是在编译期间编译器决定的。而在传入派生类对象数组后,array中各对象指针距离就改变了(除非派生类没有增加任何东西),但是编译期显然并没有这么认为,所以结果令人无法预料。
    


    同样的,多态方式删除数组一样会有问题。
    void deleteArray((BasedClass  array[])
    {
        delete[] array;
    }
    当数组被删除时,数组中每一个元素的destructor都必须被调用,当编译器看到delete[] array;这行代码必须产生出类似下列的代码:
    //将*array中的对象以其构造次序的相反次序进行析构
    for(int i = the number of elements in the array - 1; i >= 0; --i)
    {
        array[i].BasedClass::~BasedClass();  //调用array[i]的destructor 
    }

猜你喜欢

转载自blog.csdn.net/u010248077/article/details/80686268
今日推荐