[問題] 關於虛擬繼承的觀念。

看板C_and_CPP作者 (優酪乳)時間7年前 (2016/07/27 05:21), 編輯推噓7(705)
留言12則, 4人參與, 最新討論串1/1
自認為虛擬繼承的觀念很模糊,通常一多重,自己的答案就很沒信心。 希望強者可以給我淺顯易懂的理解。 Case 1: main1跑下來結果d->virt1()沒問題應該是150沒錯,但Global1( d )跑出來的結果為什麼不是100? #include <stdio.h> class Base1 { public: virtual int virt1() { return 100; } int data1; }; class Derived : public Base1 { public: virtual int virt1() { return 150; } int derivedData; }; int Global1( Base1 * b1 ) { return b1->virt1(); } main1() { Derived * d = new Derived; printf( "%d %d\n", d->virt1(), Global1( d )); } ________ Case 2:Main2跑下來的結果, md->virt1() 應該是150 Global1( md )這個是100還是150自己就沒甚麼信心了。 md->virt2()這個應該也是250 Global2( md )這個應該是250吧? class Base2 { public: virtual int virt2() { return 200; } int data2; }; class MultipleDerived : public Base1, public Base2 { public: virtual int virt1() { return 150; } virtual int virt2() { return 250; } int derivedData; }; int Global2( Base2 * b2 ) { return b2->virt2(); } main2() { MultipleDerived * md = new MultipleDerived; printf( "%d %d %d %d\n", md->virt1(), Global1( md ), md->virt2(), Global2( md )); } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 12.106.68.40 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1469568101.A.84D.html

07/27 05:41, , 1F
Based type pointer 會透過virtual table 指到derived
07/27 05:41, 1F

07/27 05:41, , 2F
class virtual function
07/27 05:41, 2F

07/27 06:48, , 3F
買本書吧,孩子
07/27 06:48, 3F

07/27 09:06, , 4F
光從字面解釋,在 Global1 函數範圍內把 b1 當作 Ba
07/27 09:06, 4F

07/27 09:11, , 5F
se1 來操作,所以呼叫 Global1(d) 回傳當然是 Base1
07/27 09:11, 5F

07/27 09:11, , 6F
的定義結果嘍。Global2 自然也是同樣的道理。
07/27 09:11, 6F

07/27 18:08, , 7F
樓上說的行為應該是non-virtual才對吧@@
07/27 18:08, 7F

07/27 18:11, , 8F
virtual 就是像一樓講的 vtable 查表上去,會先查到
07/27 18:11, 8F

07/27 18:11, , 9F
子類別的定義
07/27 18:11, 9F

07/28 02:10, , 10F
繼承的類別都有一個virtual table 是一個表格 裡面放每
07/28 02:10, 10F

07/28 02:10, , 11F
個function的位置 所以你call 的時候他會去查表 自然而
07/28 02:10, 11F

07/28 02:10, , 12F
然就會找到derived class的函數 這樣有比較清楚嗎
07/28 02:10, 12F
文章代碼(AID): #1NbzHbXD (C_and_CPP)