一、虛擬繼承+虛函式
場景①:派生類沒有自己的虛函式,只是繼承基類的虛函式
我們看乙個例子:
class base
virtual void funtest2()
int _b;
};class derived :virtual public base
virtual void funtest2()
int _d;
};typedef void(*funsrc)();
void print(base&b)//列印函式
}int main()
分析一下:
②派生類有自己的虛函式
class base
virtual void funtest2()
int _b;
};class derived :virtual public base
virtual void funtest2()
virtual void funtest3()
int _d;
};typedef void(*funsrc)();
void print(base&b)//列印函式
}void print(derived&d)//列印函式
}
分析一下:
總結:
1.同乙個類的物件共用一張虛表;
2.派生類和基類各自的虛表。
二、菱形虛擬繼承(含虛函式)
舉個例子:
class b
virtual void funtest2()
int _b;
};class c1 :virtual public b
virtual void funtest3()
int _c1;
};class c2 :virtual public b
virtual void funtest4()
int _c2;
};class d :public c1,public c2
virtual void funtest3()
virtual void funtest5()
int _d;
};
分析一下:
對於含有虛函式的菱形虛擬繼承,我們要考慮的內容就比較複雜了,菱形虛擬繼承存在多繼承的,多繼承的規則要把握好。虛擬繼承包括偏移量**。
帶有虛函式的菱形繼承和帶有虛函式的菱形虛繼承
對於某些函式來說,基類希望它的派生類定義適合自身的版本,此時基類就將這些函式宣告為虛函式。在存在虛函的類,建立物件時會產生虛表指標,虛表指標指向乙個虛表,這時就可以通過虛表訪問自己定義的函式。通過下面兩種繼承進行分析 帶有虛函式的菱形繼承 以下圖的模型為例進行分析 我們觀察c類物件在記憶體中的結構 ...
擁有虛函式覆蓋的菱形繼承及菱形虛擬繼承
在之前的部落格中有簡單的介紹了一下 沒有虛函式的菱形繼承。此篇部落格將對菱形繼承進行公升級,介紹有虛函式的菱形繼承。舉乙個簡單的例子 includeusing namespace std class aa virtual void fun2 virtual void fun3 protected i...
菱形繼承的虛函式表
虛函式 類的成員函式前面加virtual 虛函式的主要作用就是實現多型 那麼多型 顧名思義就是一種事物的多種形態。c 中,指具有不同功能的函式可以用同乙個函式名,這樣可以用乙個函式名呼叫不同內容的函式。虛函式表 虛表 通過一片連續的位址來儲存虛函式的位址 菱形繼承舉例 說明 若子類中有虛函式,而所繼...