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

醬壇子

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

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

公告

王一偉 湖南商學院畢業 電子信息工程專業

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 389015
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

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

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

我們來舉個例子:

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

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

}


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

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

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

同樣你通過bass class來刪除derived class object的時候,都會產生不可預期的錯誤

簡單的說,大家需要注意的一點就是,數組不要和多態進行混合使用,因為數組總是會涉及指針
的算術運算。

當然這個也不是絕對的,都是內存訪問惹的禍

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

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

Feedback

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

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

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

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

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

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

多謝大家關心,不過還是希望大家能詳細點告訴我錯在哪里 嘿嘿 基礎差偶歡迎大家批評 呵呵 最近惡補基礎


  回復  更多評論
  

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

# re: 不要使用polymorphically方式處理數組 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.
  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久欧美中文字幕| 欧美在线观看一区| 国产精品激情偷乱一区二区∴| 午夜在线成人av| 午夜一区在线| 久久精品99国产精品日本| 欧美在线免费看| 久久亚洲精品中文字幕冲田杏梨 | 久久久久免费视频| 欧美一区综合| 亚洲国产精品成人久久综合一区| 免费日韩av电影| 亚洲精品欧美精品| 在线综合亚洲欧美在线视频| 欧美一区二区三区男人的天堂| 欧美ab在线视频| 国产亚洲aⅴaaaaaa毛片| 亚洲美女av网站| 美女视频黄免费的久久| 亚洲欧美日韩专区| 欧美日韩中文字幕在线视频| 一区在线免费观看| 亚洲综合色丁香婷婷六月图片| 欧美69视频| 亚洲国产精品传媒在线观看| 欧美在线免费观看视频| 亚洲一区二区三区乱码aⅴ| 暖暖成人免费视频| 黄色成人在线免费| 久久久久久久97| 亚洲尤物影院| 国产日韩欧美一二三区| 性18欧美另类| 午夜精品影院在线观看| 国产有码一区二区| 久久综合伊人77777麻豆| 久久综合九色| 一区二区三区日韩欧美| 99视频日韩| 国产精品国产自产拍高清av王其| 亚洲制服av| 正在播放亚洲一区| 在线一区日本视频| 国产精品日韩欧美一区二区三区 | 亚洲视频精品| 亚洲欧美一区二区视频| 一区二区三区我不卡| 亚洲国产毛片完整版| 欧美午夜一区二区三区免费大片| 亚洲欧美资源在线| 久久免费的精品国产v∧| 一本久久a久久精品亚洲| 一区二区三区高清在线观看| 狠狠网亚洲精品| 一本色道久久综合亚洲精品婷婷 | 欧美亚洲第一页| 久久最新视频| 国产精品香蕉在线观看| 亚洲电影免费在线观看| 国产偷久久久精品专区| 亚洲国产精品一区二区www| 一区二区三区在线免费播放| 日韩午夜av电影| 亚洲最新在线视频| 久久综合色综合88| 久久综合网络一区二区| 国产一二三精品| 久久不射电影网| 久久久国产精品一区| 国产亚洲欧美在线| 欧美亚洲综合另类| 国产乱码精品一区二区三区忘忧草 | 欧美在线亚洲在线| 国产精品色一区二区三区| 99re热精品| 欧美一区二区免费视频| 国产精品美女久久久久aⅴ国产馆| 亚洲麻豆一区| 欧美一级专区| 亚洲电影av在线| 欧美理论大片| 亚洲自拍16p| 欧美jizzhd精品欧美巨大免费| 在线观看av一区| 欧美精品福利在线| 亚洲制服丝袜在线| 亚洲大片免费看| 亚洲男人的天堂在线aⅴ视频| 国产精品视区| 欧美日韩国产小视频在线观看| 亚洲精品网址在线观看| 久久综合免费视频影院| 一区二区三区黄色| 在线观看精品| 国产精品v一区二区三区| 久久全国免费视频| 亚洲自拍电影| 一区二区三区 在线观看视频| 老司机67194精品线观看| 亚洲午夜精品久久久久久浪潮| 亚洲国产成人午夜在线一区| 国产一区二区欧美日韩| 国产精品你懂的在线欣赏| 欧美激情bt| 免费日韩成人| 欧美高清视频一区二区| 久久久久亚洲综合| 一本色道久久综合亚洲精品高清 | 欧美亚洲在线| 亚洲三级色网| 亚洲精品一区二区三区在线观看| 免费黄网站欧美| 欧美电影在线免费观看网站| 欧美电影在线观看完整版| 欧美黄色视屏| 亚洲福利在线观看| 亚洲精品日本| 亚洲自拍偷拍网址| 久久久精品国产一区二区三区| 久久精品国产清自在天天线 | 欧美一区二区三区四区在线观看地址 | 欧美一区二区成人6969| 久久av免费一区| 蜜臀久久99精品久久久画质超高清| 免费不卡在线视频| 国产精品视频成人| 在线看片第一页欧美| 亚洲免费视频成人| 免费在线看一区| 亚洲一区www| 欧美区日韩区| 亚洲福利国产| 久久成人一区二区| 亚洲精品国产无天堂网2021| 亚洲精品久久久久久一区二区 | 欧美日韩国产亚洲一区| 好吊色欧美一区二区三区四区| 一区二区欧美日韩| 欧美成年网站| 久久久精品动漫| 国产精品久久久久久久久动漫| 亚洲精品国产欧美| 欧美多人爱爱视频网站| 久久精品国产久精国产一老狼| 欧美午夜精品久久久| 亚洲美女av网站| 亚洲精品欧美在线| 欧美久久精品午夜青青大伊人| 亚洲经典三级| 亚洲国产精品久久久久秋霞不卡| 久久久噜噜噜久久中文字免| 韩国v欧美v日本v亚洲v| 久久免费国产| 欧美大片专区| 亚洲五月六月| 午夜精品在线看| 亚洲黄色在线| 日韩视频―中文字幕| 欧美三级乱码| 久久嫩草精品久久久精品一| 久久精品国产亚洲高清剧情介绍| 黄色精品一区二区| 欧美大尺度在线观看| 欧美性大战久久久久久久| 欧美一区二区三区视频在线| 久久久久久一区| 中文在线资源观看视频网站免费不卡| 99av国产精品欲麻豆| 黑人巨大精品欧美一区二区| 亚洲人成人一区二区在线观看| 国产精品hd| 91久久精品国产91性色| 免费成人激情视频| 国产伊人精品| 久久蜜桃精品| 韩国av一区二区| 欧美国产三级| 亚洲第一综合天堂另类专| 亚洲精品视频中文字幕| 在线看欧美日韩| 久久精品视频免费播放| 久久xxxx| 黄色综合网站| 免费试看一区| 久久天天躁狠狠躁夜夜爽蜜月| 国产女主播一区| 久久久国产精品一区| 免费一级欧美在线大片| 国产精品日日做人人爱| 欧美中文字幕在线播放| 欧美激情成人在线| 欧美一级片在线播放| 激情五月***国产精品| 久久综合999| 亚洲一区二区免费看| 久久久999精品| 一道本一区二区| 国产精品久久久久久亚洲毛片| 亚洲欧美国内爽妇网| 免费短视频成人日韩|