您好,登錄后才能下訂單哦!
菱形繼承:
Assitant的菱形繼承對象模型
Assitant中有兩份Person成員,存在二義性和數據冗余。
所以我們引出了虛擬繼承。
virtual虛繼.不會在子類中創建父類成員,但是子類中可以引用,就像指針一樣。主要用在菱形繼承,也叫鉆石繼承。
虛擬繼承對象模型
class Student : vitrual public Person class Teacher : virtual public Peraon
虛函數表
通過一塊連續內存來存儲虛函數的地址。這張表解決了繼承、虛函數(重寫)的
問題。在有虛函數的對象實例中都存在一張虛函數表,虛函數表就像一張地圖,指明了實
際應該調用的虛函數。
舉例:
typedef void(*PFUN)(); void PrintVT(int p)//打印虛函數表的信息 { PFUN pfun = NULL; int *ptr = (int *)p; cout << "虛表地址->" << ptr << endl; int i = 0; while (ptr[i]) { pfun = (PFUN)ptr[i]; cout << "第" << i << "個虛函數地址-》 " << pfun<<"----"; pfun(); i++; } }
class B { public: virtual void fun1() { cout << "B::fun1()" << endl; } virtual void fun2() { cout << "B::fun2()" << endl; } private: int _b; }; class D :public B { public: virtual void fun1() { cout << "D::fun1()" << endl; } virtual void fun3() { cout << "D::fun3()" << endl; } virtual void fun4() { cout << "D::fun4()" << endl; } private: int _d; }; int main() { D d; B b; PrintVT(*(int *)&d); cout << endl; PrintVT(*(int *)&b); getchar(); return 0; }
其結果如下:
這就是我們所說的虛函數。因為在D里重寫的B::fun1();所以D中的fun1()就被覆蓋了。小伙伴們懂了嗎?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。