[問題] virtual function 的疑惑2
看了上面那篇的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
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 4 篇):