[問題] virtual function 的疑惑2

看板C_and_CPP作者 (我愛阿蓉)時間15年前 (2010/02/10 06:52), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/4 (看更多)
看了上面那篇的virtual function 想了一些情況 但是不知道該怎麼去解釋 有三個問題想請教 1. class Base1 { public: void f() {cout<<"1"; } }; int main() { int *p=(new int); Base1 *a1 = (Base1*)p; a1->f(); return 0; } 這個情況 a1->呼叫的到f() 印出1.... 這是因為什麼原因他可以link到f()? 想一下 印出sizeof(Base1) 會 印1...這個1不知道是什麼的size... 當我加上virtual 就會run time 壞掉 2. http://nopaste.csie.org/93cdd 這是簡單的dynamic binding 如果以上一篇的觀念(我想可能還不夠解釋dynamic binding) a1->他自己的vptr 只有記載她自己的a1::f() 他是什麼機制可以知道Base3也有繼承他 也有override f()? 我認為他是 a1->Base1::f() => Base2::f() => Base3::f() 但中間的=>關係 是哪裡有記錄呢? 3. 我印出sizeof(Base3)印出4 覺得很怪 他繼承 Base2至少要有Base2的vptr並且還得到Base1的vptr 和自己的vptr 想說印出12比較合理 我觀念錯很大 於是寫成 多繼承一個 class Base3 : public Base2, public Base1{ 印出8... 故意繼承個空class 也印出8 class Base4{}; class Base3 : public Base4{ 仔細想一下 如果我繼承觀念沒錯的話 class A{int x}; class B:public A{double y;}; B會擁有 父親的A::x(4) 和自己繼承來的B::x(4) 和原本自己的B::y(8) sizeof(B) = 24的原因應該是 有三個變數 所以是3* max大小 所以=3*8=24.. 但如果是扯到vptr的話 就我測試的結論 感覺vptr還是只有一個 而 vtable就一直增加記錄有誰override他 就在加上去 所以可能可以解釋 2.的問題 由一個vptr可以一直link到 Base3::f() 但這樣我就不能解釋 class Base4{}; class Base3 : public Base4{ 得到8 和 class Base3 : public Base2, public Base1{ 得到8 有諸多觀念無法融會貫通 手邊的書籍也沒有寫的這麼深入= = (該買深入一點的書了) 雖然我覺得不懂也沒差反正可以run就好 但是好奇心還是讓我想問這幾項問題 問題繁多@@請教各位 非常感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222
文章代碼(AID): #1BSbUzB9 (C_and_CPP)
文章代碼(AID): #1BSbUzB9 (C_and_CPP)