青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術(shù) 在這里寫下自己的學(xué)習(xí)心得 感悟 和大家討論 共同進(jìn)步(歡迎批評!!!)

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學(xué)院畢業(yè) 電子信息工程專業(yè)

常用鏈接

留言簿(19)

我參與的團(tuán)隊

搜索

  •  

積分與排名

  • 積分 - 389018
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

inheritance的重要性質(zhì)就是你可以通過指向base class objects的pointers或者references來操作derived class object.

同樣C++也允許你使用pointers或者references來操作derived class object形成的數(shù)組。但是這樣的行為很危險,幾乎不會按你設(shè)定的方式運作。

我們來舉個例子:

?class?A{};
?class?B:public?A{};

?//現(xiàn)在我們有一個函數(shù)
void?printAArray(ostream&?s,const?A?array[],int?numElement)
{
???
??? for(int?i=0;i<numElement;++i)
??????
{
??????????? s
<<array[i];//假設(shè)A?objects中有一個operator<<可以用?
?
???? }

}


當(dāng)你把A AArray[10];傳給他
...
printAArray(cout,AArray,10);//運作良好

但是當(dāng)你把B BArray傳給他
printAArray(cout,BArray,10);//還能正常運作嗎

毫無疑問,編譯時編譯器會很開心的接受他。但是運行時呢
?for(int?i=0;i<numElement;++i)
??
{
??????????? s
<<array[i];//假設(shè)A?objects中有一個operator<<可以用?
?
}
就會出問題,array所指向的內(nèi)存和array+i所指向的內(nèi)存有多遠(yuǎn)的距離
答案是i*sizeof(A),但是我們在穿BArray的時候我們需要的是i*sizeof(B),因為
derived class object通常比base class object 大。

同樣你通過bass class來刪除derived class object的時候,都會產(chǎn)生不可預(yù)期的錯誤

簡單的說,大家需要注意的一點就是,數(shù)組不要和多態(tài)進(jìn)行混合使用,因為數(shù)組總是會涉及指針
的算術(shù)運算。

當(dāng)然這個也不是絕對的,都是內(nèi)存訪問惹的禍

如果你能夠避免一個具象類(帶有參數(shù)的類)繼承自另外的一個具象類,你就不太能犯
下這樣的錯誤。

具體的內(nèi)容我晚上在下一篇隨筆里面進(jìn)行介紹
posted on 2007-01-31 09:44 @王一偉 閱讀(1434) 評論(7)  編輯 收藏 引用

Feedback

# re: 不要使用polymorphically方式處理數(shù)組 2007-01-31 23:23 Elvis
個人覺得這是一個典型的對象切片~A AArray[10]中的10個A對象的實例是分配在棧上的靜態(tài)對象,而不是分配在堆上的動態(tài)對象吧~這樣的話其實就不存在多態(tài)了,因為多態(tài)是對指針對象而言的,于是當(dāng)將子類對象賦給基類對象時,對象切片就發(fā)生了~  回復(fù)  更多評論
  

# re: 不要使用polymorphically方式處理數(shù)組 2007-02-01 11:23 王一偉
不是吧,棧內(nèi)我還是可以調(diào)用函數(shù)的,再入棧一次就是了,我仍然可以使用指針方式進(jìn)行參數(shù)傳遞。
確實,這個是一個切片現(xiàn)象。
呵呵
老兄 發(fā)覺這人好少啊 我想搬去csdn了 那人好多  回復(fù)  更多評論
  

# re: 不要使用polymorphically方式處理數(shù)組 2007-02-02 01:08 OOMusou
Elvis說的沒錯
很典型的Object Slicing
請看Effective C++ 條款20  回復(fù)  更多評論
  

# re: 不要使用polymorphically方式處理數(shù)組 2007-02-02 09:15 holyfire
這根本不是多態(tài)的運用方式,C++下使用多態(tài)要用基類指針的方式,看來你還需要加強下基礎(chǔ)  回復(fù)  更多評論
  

# re: 不要使用polymorphically方式處理數(shù)組 2007-02-02 11:41 王一偉
恩,我馬上去瞧瞧Effective C++ 條款20,汗 我還沒看到那

但是這個不是多態(tài)需要的基類指針的方式我就表示懷疑了,
只要virtual了base class的destructor 感覺后面的問題就可以解決了

多謝大家關(guān)心,不過還是希望大家能詳細(xì)點告訴我錯在哪里 嘿嘿 基礎(chǔ)差偶?xì)g迎大家批評 呵呵 最近惡補基礎(chǔ)


  回復(fù)  更多評論
  

# re: 不要使用polymorphically方式處理數(shù)組 2007-02-03 01:52 Elvis
PS:你說的這個問題在C++ CODING STANDARDS的第100條有論述~  回復(fù)  更多評論
  

# re: 不要使用polymorphically方式處理數(shù)組 2007-02-03 09:03 醬菜
呵呵 是的 Elvis兄

Don't treat arrays polymorphically

Pointers serve two purposes at the same time: that of monikers (small identifiers of objects), and that of array iterators (they can walk through arrays of objects using pointer arithmetic). As monikers, it makes a lot of sense to treat a pointer to Derived as a pointer to Base. As soon as the array iteration part enters the stage, however, such substitutability breaks down because an array of Derived isn't the same as an array of Base. To illustrate: Mice and elephants are both mammals, but that doesn't mean a convoy of a thousand elephants would be as long as one of a thousand mice.

Size does matter. When substituting a pointer to Derived to a pointer to Base, the compiler knows exactly how to adjust the pointer (if necessary) because it has enough information about both classes. However, when doing pointer arithmetic on a pointer p to Base, the compiler computes p[n] as *(p + n * sizeof(Base)), thus assuming that the objects lying in memory are all Base objectsand not objects of some derived type that might have a different size. Imagine, now, just how easy it is to tromp all over of an array of Derived if you convert the pointer marking its start to Base* (with compiler's silent approval) and then perform pointer arithmetic on that pointer (while the compiler doesn't blink an eye either)!

Such accidents are an unfortunate interaction between substitutability, which dictates that pointers to derived classes should be usable as pointers to their bases, and C's legacy pointer arithmetic, which assumes pointers are monomorphic and uses solely static information to compute strides.

To store arrays of polymorphic objects, you need an array (or, better still, a real container; see Item 77) of pointers to the base class (e.g., plain pointers or, better still, shared_ptrs; see Item 79). Then each pointer in the array refers to a polymorphic object, likely an object allocated on the free store. Or, if you want to expose an interface to a container of polymorphic objects, you need to encapsulate the entire array and offer a polymorphic interface for iteration.

Incidentally, a good reason to prefer references to pointers in interfaces is to make it clear that you're talking about one object, as opposed to possibly an array of them.
  回復(fù)  更多評論
  


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲视频axxx| 新67194成人永久网站| 狠狠色噜噜狠狠狠狠色吗综合| 久久综合九色综合网站| 亚洲图片激情小说| 老司机午夜精品视频| 午夜精品影院| 欧美在线播放| 久久青草欧美一区二区三区| 久久精品国产v日韩v亚洲| 欧美亚洲在线视频| 性欧美大战久久久久久久久| 欧美在线观看视频在线| 久久永久免费| 欧美理论电影网| 国产精品久久久久久久久久免费 | 亚洲欧美日韩国产一区| 午夜视频精品| 免费成人高清| 亚洲破处大片| 一本色道久久综合| 性高湖久久久久久久久| 免费久久久一本精品久久区| 欧美99久久| 国产精品国色综合久久| 一区二区三区自拍| 中日韩在线视频| 久久国产精品一区二区三区四区| 免费中文日韩| 中国日韩欧美久久久久久久久| 欧美一区二粉嫩精品国产一线天| 美腿丝袜亚洲色图| 亚洲国产欧美在线人成| 亚洲欧美日韩精品在线| 欧美国产成人在线| 国产一区二区三区黄视频| 99re亚洲国产精品| 久久久久久久久久码影片| 亚洲国产一区二区在线| 午夜精品网站| 欧美日韩免费观看一区三区| 国产主播在线一区| 亚洲综合大片69999| 欧美国产一区二区| 久久激情五月婷婷| 国产精品综合av一区二区国产馆| 亚洲国产日韩一级| 久久综合国产精品| 香蕉久久一区二区不卡无毒影院| 欧美日韩国产欧美日美国产精品| 激情丁香综合| 欧美一区激情| 亚洲视频1区| 欧美三级韩国三级日本三斤| 亚洲国产精品va在线看黑人| 久久激情五月丁香伊人| 一区二区三区欧美日韩| 欧美高清成人| 亚洲激情综合| 欧美国产亚洲精品久久久8v| 久久精品视频va| 国产亚洲一本大道中文在线| 久久av一区二区三区亚洲| 91久久线看在观草草青青| 久久亚洲精品伦理| 一区二区在线观看视频在线观看| 欧美一级大片在线观看| 一区二区三区日韩欧美| 欧美三区不卡| 亚洲欧美日本另类| 亚洲一区在线观看免费观看电影高清| 欧美另类女人| aa级大片欧美三级| 亚洲精品一区二区三区婷婷月| 免费av成人在线| 在线国产精品播放| 久久综合亚洲社区| 久久三级视频| 亚洲人成网站影音先锋播放| 欧美国产日本在线| 欧美日本中文字幕| 亚洲女女女同性video| 亚洲欧美综合v| 在线观看国产精品网站| 亚洲高清123| 国产精品劲爆视频| 美女黄毛**国产精品啪啪| 欧美精品七区| 久久国产精品一区二区三区四区 | 99亚洲一区二区| 国产精品一级| 欧美激情第1页| 国产精品青草久久| 欧美激情女人20p| 国产精品爽黄69| 亚洲第一精品夜夜躁人人爽| 欧美色图五月天| 美日韩精品免费| 国产精品日韩在线观看| 亚洲第一精品在线| 国产精品一区一区三区| 亚洲电影免费观看高清完整版在线| 欧美电影免费观看高清| 欧美一站二站| 欧美人与性动交a欧美精品| 亚洲一区二区网站| 亚洲欧美激情四射在线日 | 亚洲小说欧美另类社区| 亚洲精品免费在线播放| 欧美日韩国产成人在线91| 国产欧美精品一区aⅴ影院| 91久久在线播放| 欧美日韩一区二区精品| 亚洲一级网站| 午夜在线一区| 影音先锋中文字幕一区| 欧美电影免费观看大全| 国产又爽又黄的激情精品视频| 久久综合狠狠综合久久综合88 | 日韩视频在线一区二区| 欧美日本亚洲视频| 午夜精品久久久久久久99热浪潮| 亚洲视频在线二区| 国产一区二区三区高清播放| 亚洲一区二区三区精品视频| 国产视频一区二区三区在线观看| 久久人人97超碰国产公开结果| 久色成人在线| 亚洲一区二区视频在线| 午夜精品成人在线| 欧美日韩在线观看一区二区| 91久久精品视频| 国产精品久久久爽爽爽麻豆色哟哟| 欧美在线视频一区二区三区| 久久夜色精品国产| 亚洲美女91| 亚洲欧美日韩精品一区二区 | 久久影音先锋| 老牛影视一区二区三区| 欧美久久婷婷综合色| 久久精品国产亚洲aⅴ| 久久米奇亚洲| 亚洲欧美区自拍先锋| 亚洲欧美国产视频| 久久中文在线| 国产精品99一区二区| 欧美成人在线网站| 国产精品视频大全| 亚洲人永久免费| 欧美va亚洲va日韩∨a综合色| 亚洲综合久久久久| 久久综合给合久久狠狠狠97色69| 亚洲一区二区精品在线| 久久尤物视频| 久久福利毛片| 亚洲人成在线观看| 久久久久成人精品| 午夜日本精品| 欧美日韩国产综合网| 欧美高清在线观看| 久久亚洲春色中文字幕久久久| 欧美激情一区二区三区全黄| 国产九色精品成人porny| 亚洲国产日韩欧美在线99 | 久久艳片www.17c.com| 久久精品中文字幕免费mv| 国产精品99免费看 | 亚洲日韩成人| 亚洲韩国日本中文字幕| 久久久久国色av免费观看性色| 亚洲综合成人婷婷小说| 欧美日韩国产在线观看| 亚洲精品美女久久7777777| 久久精品一区| 国产欧美日韩亚州综合| 亚洲一区欧美| 欧美一区二区三区的| 欧美三级在线| 久久久人成影片一区二区三区观看| 亚洲日本激情| 欧美风情在线| 亚洲美女av网站| 亚洲视频一区在线观看| 欧美日韩天堂| 欧美成ee人免费视频| 亚洲国产cao| 国产欧美一区二区精品性色| 亚洲欧美日韩视频一区| 欧美一区二区三区啪啪| 在线亚洲成人| 国产精品视频专区| 欧美一区二区三区另类| 蜜桃久久av一区| 99视频在线观看一区三区| 伊人久久综合97精品| 欧美成人自拍视频| 中日韩视频在线观看| 欧美在线视频网站| 亚洲第一页在线| 亚洲电影在线观看|