亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

More Effective C++:不使用多態性數組

2019-11-17 05:32:34
字體:
來源:轉載
供稿:網友

  類繼續的最重要的特性是你可以通過基類指針或引用來操作派生類。這樣的指針或引用具有行為的多態性,就似乎它們同時具有多種形態。C++答應你通過基類指針和引用來操作派生類數組。不過這根本就不是一個特性,因為這樣的代碼根本無法如你所愿地那樣運行。

  假設你有一個類BST(比如是搜索樹對象)和繼續自BST類的派生類BalancedBST:

class BST { ... };
class BalancedBST: public BST { ... };
  在一個真實的程序里,這樣的類應該是模板類,但是在這個例子里并不重要,加上模板只會使得代碼更難閱讀。為了便于討論,我們假設BST和BalancedBST只包含int類型數據。

  有這樣一個函數,它能打印出BST類數組中每一個BST對象的內容:

void PRintBSTArray(ostream& s,
const BST array[],
int numElements)
{
 for (int i = 0; i < numElements; ) {
  s << array[i]; //假設BST類
 } //重載了操作符<<
}
  當你傳遞給該函數一個含有BST對象的數組變量時,它能夠正常運行:

BST BSTArray[10];
...
printBSTArray(cout, BSTArray, 10); // 運行正常
  然而,請考慮一下,當你把含有BalancedBST對象的數組變量傳遞給printBSTArray函數時,會產生什么樣的后果:

BalancedBST bBSTArray[10];
...
printBSTArray(cout, bBSTArray, 10); // 還會運行正常么?
  你的編譯器將會毫無警告地編譯這個函數,但是再看一下這個函數的循環代碼:

for (int i = 0; i < numElements; ) {
 s << array[i];
}
  這里的array[I]只是一個指針算法的縮寫:它所代表的是*(array)。我們知道array是一個指向數組起始地址的指針,但是array中各元素內存地址與數組的起始地址的間隔究竟有多大呢?它們的間隔是i*sizeof(一個在數組里的對象),因為在array數組[0]到[I]間有I個對象。編譯器為了建立正確遍歷數組的執行代碼,它必須能夠確定數組中對象的大小,這對編譯器來說是很輕易做到的。參數array被聲明為BST類型,所以array數組中每一個元素都是BST類型,因此每個元素與數組起始地址的間隔是be i*sizeof(BST)。

  至少你的編譯器是這么認為的。但是假如你把一個含有BalancedBST對象的數組變量傳遞給printBSTArray函數,你的編譯器就會犯錯誤。在這種情況下,編譯器原先已經假設數組中元素與BST對象的大小一致,但是現在數組中每一個對象大小卻與BalancedBST一致。派生類的長度通常都比基類要長。我們料想BalancedBST對象長度的比BST長。假如如此的話,printBSTArray函數生成的指針算法將是錯誤的,沒有人知道假如用BalancedBST數組來執行printBSTArray函數將會發生什么樣的后果。不論是什么后果都是令人不愉快的。

  假如你試圖刪除一個含有派生類對象的數組,將會發生各種各樣的問題。以下是一種你可能的不正確的做法。

//刪除一個數組, 但是首先記錄一個刪除信息
void deleteArray(ostream& logStream, BST array[])
{
 logStream << "Deleting array at address "
 << static_cast(array) << '/n';
 delete [] array;
}
BalancedBST *balTreeArray = // 建立一個BalancedBST對象數組
new BalancedBST[50];
...
deleteArray(cout, balTreeArray); // 記錄這個刪除操作
  這里面也掩藏著你看不到的指針算法。當一個數組被刪除時,每一個數組元素的析構函數也會被調用。當編譯器碰到這樣的代碼:

delete [] array;
  它肯定象這樣生成代碼:

// 以與構造順序相反的順序來
// 解構array數組里的對象
for ( int i = 數組元素的個數 1; i >= 0;--i)
{
 array[i].BST::~BST(); // 調用 array[i]的
} // 析構函數
  因為你所編寫的循環語句根本不能正運行,所以當編譯成可執行代碼后,也不可能正常運行。語言規范中說通過一個基類指針來刪除一個含有派生類對象的數組,結果將是不確定的。這實際意味著執行這樣的代碼肯定不會有什么好結果。多態和指針算法不能混合在一起來用,所以數組與多態也不能用在一起。

  值得注重的是假如你不從一個具體類(concrete classes)(例如BST)派生出另一個具體類(例如BalancedBST),那么你就不太可能犯這種使用多態性數組的錯誤。正如我在后面將介紹的條款33所解釋的,不從具體類派生出具體類有很多好處。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区美女视频| 欧美极品少妇xxxxⅹ免费视频| 国产精品日韩欧美大师| 亚洲第一av网站| 永久555www成人免费| 国产剧情久久久久久| 亚洲电影免费观看高清完整版在线| 欧美日韩视频免费播放| 日本精品久久电影| 久久人人爽亚洲精品天堂| 国产精品91久久久久久| 91在线视频成人| 亚洲理论片在线观看| 亚洲综合在线做性| 久久精品2019中文字幕| 丝袜情趣国产精品| 久久福利网址导航| 国产日韩在线播放| 亚洲视频在线免费观看| 欧美伊久线香蕉线新在线| 国产成一区二区| 亚洲午夜激情免费视频| 欧美精品videos性欧美| 亚洲欧洲在线视频| 中文日韩电影网站| 国产日韩欧美综合| 成人免费黄色网| 国产激情视频一区| 亚洲人成自拍网站| 精品视频www| 成人免费网站在线| 亚洲精品自产拍| 亚洲毛茸茸少妇高潮呻吟| 精品国产老师黑色丝袜高跟鞋| 成人精品视频99在线观看免费| 91九色精品视频| 91在线观看免费高清| 亚洲成人黄色在线观看| 最近免费中文字幕视频2019| 91视频国产精品| 日韩一区在线视频| 国内成人精品视频| 国产成人jvid在线播放| 98精品在线视频| 欧美日韩亚洲精品内裤| 欧美激情国内偷拍| 欧美成人久久久| 色与欲影视天天看综合网| 国产成人在线精品| 国产精品视频最多的网站| 欧美日本精品在线| 欧美福利视频网站| 日韩网站在线观看| 97视频免费在线观看| 成人av在线亚洲| 国产精品青青在线观看爽香蕉| 欧美精品电影免费在线观看| 国产精品久久久久久久久久久久| 色偷偷91综合久久噜噜| 国产一区二区在线播放| 欧美成人免费在线视频| 日韩欧美在线视频日韩欧美在线视频| 热久久免费视频精品| 国产精品一区专区欧美日韩| 国产精品老牛影院在线观看| 亚洲国产日韩欧美综合久久| 久久中文字幕在线视频| 国产一区二区三区高清在线观看| 亚洲三级黄色在线观看| 日韩欧美有码在线| 国产精品久久久一区| 国产精品网址在线| 自拍偷拍亚洲一区| 久久亚洲精品一区二区| 亚洲最大的网站| 亚洲欧洲一区二区三区久久| 成人精品福利视频| 欧美韩日一区二区| 国产美女扒开尿口久久久| 亚洲系列中文字幕| 欧美日韩电影在线观看| 永久免费精品影视网站| 欧美激情亚洲国产| 亚洲最新中文字幕| 伊人久久久久久久久久久| 国产成+人+综合+亚洲欧美丁香花| 欧美激情一级欧美精品| 久久成人这里只有精品| 久久成人精品电影| 欧美日韩国产一区二区三区| 中文日韩在线观看| 亚洲国产成人精品一区二区| 欧美激情xxxx| 一级做a爰片久久毛片美女图片| 日韩欧美一区二区在线| 国语自产精品视频在线看| 一区二区在线免费视频| 国产精品视频区1| 57pao成人永久免费视频| 精品毛片三在线观看| 在线观看日韩www视频免费| 欧美猛交ⅹxxx乱大交视频| 精品国产乱码久久久久久天美| 日韩美女视频中文字幕| 欧美日韩中文在线| 国产精品丝袜久久久久久不卡| 日日骚久久av| 欧美日韩一区二区三区| 久久久久久久久久亚洲| 成人免费在线网址| 国产精品精品久久久| 国产精品草莓在线免费观看| 国产精品激情av电影在线观看| 91美女片黄在线观| 亚洲精品资源在线| 日韩h在线观看| 成人激情视频免费在线| 91精品国产自产91精品| 亚洲国产成人精品久久久国产成人一区| 国产精品视频自在线| 欧美福利小视频| 欧美国产在线视频| 国产精品mp4| 一本久久综合亚洲鲁鲁| 最新亚洲国产精品| 久久视频在线直播| 国产精品狠色婷| 久久青草精品视频免费观看| 欧美激情第99页| 欧美大片在线影院| 国产成人小视频在线观看| 日韩精品中文在线观看| 欧美一级成年大片在线观看| 久久久久九九九九| 一区二区三区国产在线观看| 国产精品视频网站| 热久久99这里有精品| 亚洲理论电影网| 亚洲精品福利资源站| 国内精品一区二区三区| 亚洲韩国日本中文字幕| 亚洲福利精品在线| 国产精品第一视频| 在线观看免费高清视频97| 欧美激情女人20p| 国产精品va在线播放我和闺蜜| 欧美国产在线电影| 日韩成人高清在线| 欧美在线视频播放| 精品少妇一区二区30p| 亚洲毛片在线看| 国产精品视频久久久| 欧美国产日韩中文字幕在线| 精品美女国产在线| 亚洲影视九九影院在线观看| 欧美孕妇与黑人孕交| 日韩亚洲在线观看| 国产精品视频专区| 欧美日韩国产中文字幕| 在线观看亚洲区| 国产xxx69麻豆国语对白| 国产精品手机播放| 日韩av在线高清| 中文字幕少妇一区二区三区|