亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3035 | 回復: 8
打印 上一主題 下一主題

[C++] 關于C++ Primer中“通過基類調(diào)用被屏蔽的虛函數(shù)” [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-07-06 21:10 |只看該作者 |倒序瀏覽
在C++ Primer 15.5.4中有一個例子,看了很久沒有看懂,請教一下大家(分割線中是書中的原話);
===============================================================
class Base {
     public:
         virtual int fcn();
     };
     class D1 : public Base {
     public:
          // hides fcn in the base; this fcn is not virtual
          int fcn(int); // parameter list differs from fcn in Base
          // D1 inherits definition of Base::fcn()
     };
     class D2 : public D1 {
     public:
         int fcn(int); // nonvirtual function hides D1::fcn(int)
         int fcn();    // redefines virtual fcn from Base
     };
從 Base 繼承的虛函數(shù)不能通過 D1 對象(或 D1 的引用或指針)調(diào)用,因為該函數(shù)被 fcn(int) 的定義屏蔽了。

通過基類類型的引用或指針調(diào)用函數(shù)時,編譯器將在基類中查找該函數(shù)而忽略派生類:

     Base bobj;  D1 d1obj;  D2 d2obj;
     Base *bp1 = &bobj, *bp2 = &d1obj, *bp3 = &d2obj;
     bp1->fcn();   // ok: virtual call, will call Base::fcnat run time
     bp2->fcn();   // ok: virtual call, will call Base::fcnat run time
     bp3->fcn();   // ok: virtual call, will call D2::fcnat run time
===============================================================

對于bp1和bp3,都沒有問題,但是對于bp2 ,為什么是可以調(diào)用的,存在如下疑問:

1) bp2 實際指向的是D1 類型的對象,但是D1 類 中定義了fcn,屏蔽了Base中的fcn,為什么會調(diào)用Base中的fcn而不出錯?
2) 對于“通過基類類型的引用或指針調(diào)用函數(shù)時,編譯器將在基類中查找該函數(shù)而忽略派生類” 這句話,無法理解;對于虛函數(shù),不是應該動態(tài)綁定嗎?動態(tài)綁定的后果就是很有可能調(diào)用派生類中重新定義的虛函數(shù);為什么這里講“忽略派生類”? 如果忽略了派生類,如何實現(xiàn)動態(tài)綁定?



論壇徽章:
0
2 [報告]
發(fā)表于 2014-07-07 08:50 |只看該作者
UP, 都休假了?

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
3 [報告]
發(fā)表于 2014-07-07 09:23 |只看該作者
1、D1的fcn跟基類的fcn參數(shù)不一樣,不能算屏蔽吧
2、 似乎話不對,bp3->fcn();不就是調(diào)用的派生類的么

論壇徽章:
0
4 [報告]
發(fā)表于 2014-07-07 09:36 |只看該作者
回復 3# hellioncu


1、D1的fcn跟基類的fcn參數(shù)不一樣,不能算屏蔽吧
--->  這個不管是C++ primer還是effective C++ , 都有這樣的說法,說是編譯器做匹配的時候,首先看的是函數(shù)名,只要函數(shù)名一樣,就算屏蔽了,前提是基類和派生類之間做選擇;

2、 似乎話不對,bp3->fcn();不就是調(diào)用的派生類的么
--->  這個,我也覺得不對,但是書上就這么寫的,頭疼

論壇徽章:
1
技術圖書徽章
日期:2014-03-06 15:32:30
5 [報告]
發(fā)表于 2014-07-07 13:05 |只看該作者
回復 4# listenxu


    兩本書都沒看過,1的說法,能把原話貼上來么?

論壇徽章:
0
6 [報告]
發(fā)表于 2014-07-07 14:09 |只看該作者
回復 5# selfrun


    The version of fcn in D1 does not redefine the virtual fcn from Base. Instead, it hides fcn from the base. Effectively, D1 has two functions named fcn: The class inherits a virtual named fcn from the Base and defines its own, nonvirtual member named fcn that takes an int parameter. However, the virtual from the Base cannot be called from a D1 object (or reference or pointer to D1) because that function is hidden by the definition of fcn(int).

D1 中的 fcn 版本沒有重定義 Base 的虛函數(shù) fcn,相反,它屏蔽了基類的 fcn。結果 D1 有兩個名為 fcn 的函數(shù):類從 Base 繼承了一個名為 fcn 的虛函數(shù),類又定義了自己的名為 fcn 的非虛成員函數(shù),該函數(shù)接受一個 int 形參。但是,從 Base 繼承的虛函數(shù)不能通過 D1 對象(或 D1 的引用或指針)調(diào)用,因為該函數(shù)被 fcn(int) 的定義屏蔽了。

=============================================================================================

以上是中英文版本;

論壇徽章:
6
技術圖書徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13處女座
日期:2014-06-16 17:43:33午馬
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辭舊歲徽章
日期:2015-03-03 16:54:15
7 [報告]
發(fā)表于 2014-07-07 17:41 |只看該作者
本帖最后由 littledick 于 2014-07-07 17:42 編輯

總是先使用自己類型定義的函數(shù),如果沒有才找基類的。
用指針或引用 調(diào)用本類型定義的虛函數(shù)的時候,才根據(jù)vt和rtti決定是哪個實現(xiàn)。
我是這樣理解的。

論壇徽章:
1
技術圖書徽章
日期:2014-03-06 15:32:30
8 [報告]
發(fā)表于 2014-07-09 09:33 |只看該作者
listenxu 發(fā)表于 2014-07-07 14:09
回復 5# selfrun

看最后一句,你對屏蔽這個詞的理解有誤,這里的屏蔽是指在D1類,使用D1對象引用或指針時,基類的同名虛函數(shù)被屏蔽

論壇徽章:
0
9 [報告]
發(fā)表于 2014-07-16 21:06 |只看該作者
回復 8# selfrun


    謝謝
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP