Re: [問題] virtual function 的疑惑2
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
05/14 08:26, 1F
→
05/14 08:27, , 2F
05/14 08:27, 2F
→
05/14 08:29, , 3F
05/14 08:29, 3F
→
05/14 08:30, , 4F
05/14 08:30, 4F
→
05/14 08:30, , 5F
05/14 08:30, 5F
→
05/14 08:31, , 6F
05/14 08:31, 6F
→
05/14 10:14, , 7F
05/14 10:14, 7F
→
05/14 10:14, , 8F
05/14 10:14, 8F
推
05/14 10:49, , 9F
05/14 10:49, 9F
→
05/14 15:54, , 10F
05/14 15:54, 10F
討論串 (同標題文章)