找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
尊貴會員無限使用任何功能認識好友、聊天,分享生活趣事搞笑、娛樂、精彩的影片讓你看
mg波多野結cosplaygegdoffice
bunny gafpre 053情欲古式傳媒十六夜demon bodldss 18

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]魔王學院的不適任

[繁]怪獸八號06-

[繁]鬼滅之刃 第四季

[簡]狼與辛香料 Merch

[繁]蔚藍檔案04-

[簡]Unnamed Memory
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 2043|回復: 11
打印上一主題下一主題

[問題]Polymorphism的問題[複製鏈接]

Rank: 1

帖子
22
積分
186 點
潛水值
16830 米
跳轉到指定樓層
樓主
發表於 2016-4-12 10:28 AM|只看該作者|倒序瀏覽
#include <iostream>
    using namespace std;

    class A {
    public:
        A() : val(0) {}
        int val;
        void run() { cout << val; }
    };

    class B : public A {
    public:
        virtual void run() { cout << val + 2; }
...
瀏覽完整內容,請先 註冊登入會員
分享分享0收藏收藏0支持支持0
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

Rank: 2Rank: 2

帖子
241
積分
299 點
潛水值
22810 米
頭香
發表於 2016-4-13 09:10 AM|只看該作者
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。
個人解讀,
* virtual function 通常是指虛擬化的函式. 用意是執行中, 才知道真正要執行的函式是哪一個. 這是達成polymorphism的方式.
* 以 A *a = new C();來說明,
  就是實際上的C物件, 以A物件的角度來看待, C物件自己的東西都看不到. 其中virtual function因為執行中才連結, 因此可以執行到C物件的virtual function.

由於程式中的例子都只是代稱, 並沒辦法帶來實例上的意義供理解, 我只能稍作說明.
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

Rank: 1

帖子
22
積分
186 點
潛水值
16830 米
3
發表於 2016-4-13 10:27 AM|只看該作者
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。
johnwanz 發表於 2016-4-13 09:10 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

個人解讀,
* virtual function 通常是指虛擬化的函式. 用意是執行中, 才知道真正要執行的函式是哪一個. 這 ...

感謝回覆,不過我還是有點不懂
...
瀏覽完整內容,請先 註冊登入會員

使用道具檢舉

Rank: 2Rank: 2

帖子
1051
積分
617 點
潛水值
27340 米
4
發表於 2016-4-13 04:10 PM|只看該作者
本帖最後由 cockroachrun 於 2016-4-13 04:11 PM 編輯

1 .C++ 中virtual member function 主要是考量效能, 跟要達到OOP 的polymorphism 功能的產物
如果你的base class 中的某個member function 跟本不須要有polymorphism  考量, 就不須要用 virtual. 有polymorphism  才須要.
有些程式語言. 如java . 只要不是 private 跟static member function . 一律是 virtual


2. 由於C++ 是屬於 compiler 類的程式語言. 程式的一大堆簡查都是在compiler time 決定. 因此. 你的base class A 中的run 不是 virtual . 對compiler 來說. 他不是動態dynamic binding . 對一個變數是 A 的instance 通通是使用 static binding . 不管是 A a; A *a=new ....
...
瀏覽完整內容,請先 註冊登入會員
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

帖子
100
積分
93 點
潛水值
9200 米
5
發表於 2016-4-13 05:03 PM|只看該作者
本帖最後由 gitlab 於 2016-4-13 05:13 PM 編輯
以這個例子來說,想請問當virtual不在base class而在derived class的時候,base class的同名function是會被derived class的override? 也就是說class B的run()會被class A的override嗎?

override 是針對 virtual function 的,
A::fun 是 non-virtual,A::fun() 和 B::fun() 之間沒有override的關係

還有就是實在搞不清楚像是A *a = new C(); 這樣a 指著的obj到底是class A還是class C?
當這個pointer被傳到Do,cast operator是當a是of class C還是A? 為何又要分static跟dynamic呢?
...
瀏覽完整內容,請先 註冊登入會員





使用道具檢舉

Rank: 1

帖子
22
積分
186 點
潛水值
16830 米
6
發表於 2016-4-14 04:21 AM|只看該作者
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
我應該有比較懂了 謝謝大家

使用道具檢舉

inunu 該用戶已被刪除
7
發表於 2016-4-14 06:13 AM|只看該作者
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
建議把事情視覺化來看待
把它當作一個 struct, 裡面放些 value type 跟 function pointer

做出的 A 物件裡面有
--------
A::val
A::run()
--------

B 物件有
--------
A::val
A::run()
........
B::run()
--------

也就是 A 跟 B 的前段結構完全一樣, 都可以拿來當 A 結構使用
而 B 新定義出來的東西也都完整被新增到後面
...
瀏覽完整內容,請先 註冊登入會員
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

Rank: 1

帖子
22
積分
186 點
潛水值
16830 米
8
發表於 2016-4-14 05:36 PM|只看該作者
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
inunu 發表於 2016-4-14 06:13 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

建議把事情視覺化來看待
把它當作一個 struct, 裡面放些 value type 跟 function pointer

這樣有好懂多了,感謝!
所以說把C物件當A用是為了可以call A::run()也可以call C::run()是嗎?
...
瀏覽完整內容,請先 註冊登入會員
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

Rank: 1

帖子
72
積分
140 點
潛水值
25459 米
9
發表於 2016-4-14 06:48 PM|只看該作者
C 是空的就不會有取代發生,所以會呼叫 B::run 沒錯.
既然 C 可以當成 A 來用,它會自動 cast 也就是前面大大說的 Upcast
因此不需要自己手動 cast 當然要也是可以只是多此一舉而已

自動向上轉型就是這種 dynamic polymorphism 的特色,但是只有指
標或 reference 可以成功,若傳的是物件,會發生 object slicing 變成
把 C 物件中 A 的子物件部分拷貝到 A,最後他就只是一個純 A 物件,指
...
瀏覽完整內容,請先 註冊登入會員
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。

使用道具檢舉

inunu 該用戶已被刪除
10
發表於 2016-4-14 07:26 PM|只看該作者
所以說把C物件當A用是為了可以call A::run()也可以call C::run()是嗎?
那我用C *c = new C()再傳過去再cast成A也是一樣嗎?


一樣
總之就是 "我實際上是甚麼" 跟 "我被怎麼用" 的關係

然後是因為C是空的,B的virtual底下沒有了,所以B跟C的物件都還是叫B::run()是吧

對, 因為你的 C 裡沒取代 run()
...
瀏覽完整內容,請先 註冊登入會員





使用道具檢舉

Rank: 1

帖子
22
積分
186 點
潛水值
16830 米
11
發表於 2016-4-15 04:09 AM|只看該作者
我了解了 感激不盡
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3224
積分
24366 點
潛水值
77410 米
12
發表於 2016-4-19 05:39 AM|只看該作者
本帖最後由 snowflying 於 2016-4-19 05:43 AM 編輯
inunu 發表於 2016-4-14 07:26 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員


一樣
總之就是 "我實際上是甚麼" 跟 "我被怎麼用" 的關係
...
瀏覽完整內容,請先 註冊登入會員
Melty Snow [雪靈]

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部