Re: [問題] virtual function 的疑惑2

看板C_and_CPP作者 (我愛阿蓉)時間15年前 (2010/05/13 19:28), 編輯推噓1(109)
留言10則, 2人參與, 最新討論串3/4 (看更多)
l大您好 我再次閱讀之前的文章 其實已經忘記了 再次閱讀後有些疑問 如下 ※ 引述《littleshan (我要加入劍道社!)》之銘言: : class Bar : public Foo { : public: : virtual void g(); : private: : double my_child_data; : }; : 同樣地,compiler 為了達成 dynamic binding,幫你產生了對應的 code: : struct Bar { : Foo_vtable* vtable; 這邊是否筆誤 反正就是 來自Foo::vtable?? 然後應該會有自己Bar的vtable吧? VTable *vtable; : int my_data; // 來自 Foo::my_data : double my_child_data; // Bar 自己的 member variable : }; : void Bar_g(Bar* this); // Bar::g() 的實作 : VTable bar_vtable; // Bar 的 vtable : bar_vtable.g = Bar_g; // 其中 g 的欄位指向 Bar::g() 的實作 : void Bar_ctor(Bar* this) // Bar 的建構式 : { : Foo_ctor(this); // 它會先呼叫爸爸的建構式 呼叫這邊的附加用處 是設定 Foo::vtable 去指向Foo的virtual function嗎? : ... : ... // 這邊是你寫在 Bar::Bar() 中的東西 : ... : this->vtable = bar_vtable; // 這行是 compiler 幫你加的 這邊就是設定Bar::vtable了吧 : } L大舉的例子 這麼一來,我們就可以達到 virtual invocation 的效果: Foo* a; a = new Foo; a->g(); // 呼叫的是 Foo::g(),因為在建構式中, // compiler 幫你把 vtable 指向 foo_vtable delete a; a = new Bar; a->g(); // 同樣的道理,這時候 vtable 指向 bar_vtable // 所以會呼叫到 Bar::g() 我再想最後一個a->g()照L大說的可以看成以下 ( *(a->vtable->g) )(a) //a->g(); 這時a->vtable 是誰的?? 我想應該是Foo::vtable吧.... 這時......Foo::vtable紀錄的是Bar::g()並不是Foo::g() 表示我上面推論錯了?? L大意思是 Foo_ctor(this);和this->vtable = bar_vtable; 似乎是存取同一個東西 才會變成把A::vtable給改了... 那B本身自己的vtable跑哪了 compiler應該有再偷加東西阿?? 完全搞糊塗了 若是如果以上沒錯~~ 假如 Bar::g(){ Foo::g() <====此時 他是去拿Foo::vtable指到對的table取得g嗎?} 這時Foo::g() compiler會轉成什麼去看待的 ( *(this->Foo::vtable->g) )(this)嗎?? 可是我實際去稍微的印一下function的位置 如下 http://nopaste.csie.org/5c310 1. cout印出的1 我忘記為什麼是印1了 跟 offset有關...可是忘了 但 printf印出 function位址 卻是相同.... 2. 中斷點 Add Watch 發現 A::XD B::XD位址 怎麼不一樣 印出來卻一樣?? 很詭異 但如果他們位址一樣 那vtable不就記錄的沒用了?? 還是我印出來的其實是錯的 中斷點的才正確??.....(VC9可斷看A::XD VC8似乎不給看) 以上 一堆怪問題 煩請各位多指教 謝謝指點 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.105.173 ※ 編輯: QQ29 來自: 123.192.105.173 (05/14 03:58)

05/14 08:26, , 1F
我也看糊塗了,為什麼文章到中間會跳出 A::vtable 跟
05/14 08:26, 1F

05/14 08:27, , 2F
B,還是說引文有漏掉什麼?
05/14 08:27, 2F

05/14 08:29, , 3F
base 有 virtual function 的 class,它的 instance 裡面
05/14 08:29, 3F

05/14 08:30, , 4F
都還有一個 vptr 欄位指向真正型別所對應的 vtable。
05/14 08:30, 4F

05/14 08:30, , 5F
vtable 的內容在 runtime 是不會變的。
05/14 08:30, 5F

05/14 08:31, , 6F
所以你從頭 this->vtable 到尾,我覺得你好像理解錯誤。
05/14 08:31, 6F

05/14 10:14, , 7F
請問T大 你是說我有寫錯 寫A::vtable??
05/14 10:14, 7F

05/14 10:14, , 8F
我怎麼找不到@@
05/14 10:14, 8F

05/14 10:49, , 9F
這時候就要在文章裡按 /,再輸入 A::vtable,就找到了。
05/14 10:49, 9F

05/14 15:54, , 10F
A::vtable應該改成 Foo::vtable@@抱歉
05/14 15:54, 10F
文章代碼(AID): #1Bx5BCoB (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Bx5BCoB (C_and_CPP)