不要用多型方式處理陣列

2021-09-25 18:26:35 字數 1687 閱讀 3193

基類中過載運算子 <

有乙個專用來處理基類物件的函式;

如果對這個函式傳入的引數是單個物件,那麼通常情況下這個函式可以接收基類物件,也可以接收派生類物件,這是c++的多型特性決定的;

但是如果這個函式處理的是物件陣列,因為指標算數表示式的工作原理,這個函式只能用來處理基類物件陣列,雖然在函式形式上也可以接收派生類物件陣列,但是函式的處理結果是不可控的,因經過函式內部的指標運算後,指標指向的位址裡的內容是不可控的。

驗證函式如下:

#include//#include #include "baseclass.h"

#include "derivedclass.h"

void printbasearray(std::ostream& s,const baseclass array,int numelement);

void main()

void printbasearray(std::ostream &s, const baseclass array,int numelement)

}

驗證結果如下,通過觀察驗證結果,我們可以看到函式在處理基類物件陣列時候,輸出的結果如我們預想的一樣,但是在處理派生類物件陣列的時候,輸出的結果卻是與我們的期望相差很遠,除了array0的那一行輸出,這是因為這一步的時候函式還沒有對陣列指標進行操作。

其他檔案中的**如下

基類宣告

#ifndef baseclass_h

#define baseclass_h

#include#include class baseclass

;#endif

基類實現

#include "baseclass.h"

baseclass::baseclass()

baseclass::baseclass(int a,int b)

baseclass::~baseclass()

std::ostream &operator<

void baseclass::funcpri()

void baseclass::funcpub()

派生類宣告

#ifndef derivedclass_h

#define derivedclass_h

#include "baseclass.h"

class derivedclass : public baseclass

;#endif

派生類實現

#include "derivedclass.h"

derivedclass::derivedclass():baseclass()

derivedclass::derivedclass(int cd):baseclass()

derivedclass::derivedclass(int ad,int bd,int cd):baseclass(ad,bd)

derivedclass::~derivedclass()

void derivedclass::funcpri2()

不要用多型方式處理陣列以及陣列的析構

今天jackxu貼了一段 說有乙個奇怪的崩潰,希望一起看看,於是一研究了一下,如下,coredump崩潰的地方在delete,編譯器是gcc 4.1.2版本。同時在visual studio 上,這個沒有錯誤。崩潰前也沒有任何輸出。include class base class parent pu...

不要以多型方式處理陣列

class bst class balancebst public bst vvoid printbstarray ostream s,const bst array,int numelements for int i 0 i numelements i s編譯器必須能夠有能力決定陣列中物件的大小。...

不要對陣列使用多型

不要對陣列使用多型 類繼承的最重要的特性是你可以通過基類指標或引用來操作派生類。這樣的指標或引用具有行為的多型性,就好像它們同時具有多種形態。c 允許你通過基類指標和引用來操作派生類陣列。不過這根本就不是乙個特性,因為這樣的 幾乎從不如你所願地那樣執行。假設你有乙個類bst 比如是搜尋樹物件 和繼承...