多重繼承:代碼復用,一個派生類有多個基類。如:class C: public A,public B{};
10年積累的成都網(wǎng)站建設、網(wǎng)站建設經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有豐澤免費網(wǎng)站建設讓你可以放心的選擇與我們合作。
虛基類:virtual可以修飾繼承方式,是虛繼承,被虛繼承的類,稱作虛基類。class A:virtual public B{};
虛繼承的類中會多一個vbptr指向vbtable,Vbtable中保存的是虛基類中數(shù)據(jù)在派生類中的內存偏移量,從虛基類中繼承的成員變量會被放在派生類內存的最下端。
虛函數(shù)和虛基類在調用的時候是沒有問題的,
但是在delete的時候會發(fā)生堆報錯
原因是:基類指針類型的成員p指向派生類對象,永遠指向的是派生類基類部分數(shù)據(jù)的起始地址,這里的基類A的起始位置就是vfptr。但是這里的派生類B是虛繼承的A,虛繼承的部分會放到派生類內存的后面,p指向的就是派生類后面的內存,這種情況Delete p就不會刪除派生類中的內存,造成了上圖中的問題。
class A{
public:
virtual void func(){cout<<"call A:func"<func();
delete p;
}
delete的內存地址與new的內存地址不同,所以會造成問題。
繼承的樣子像菱形,叫菱形繼承。類D中會繼承兩個類A中的成員。盡量避開多重繼承。
多重繼承的好處:可以做更多代碼的復用。
用虛繼承解決上面的問題。
class A{
public:
A(int data):ma(data){
cout<<"A()"<
如果虛繼承就會在B和C中構造出vbptr指針,在D中指向類A中的成員變量。
使用虛繼承避免繼承多次的問題:
class B:virtual public A{//使用虛繼承避免菱形繼承的問題
public:
B(int data):A(data),mb(data){
cout<<"B()"<
const_cast
:去掉(指針或者引用)常量屬性的一個類型轉換
static_cast
:提供編譯器認為安全的類型轉換 基類和派生類可以通過static_cast進行轉換
reinterpret_cast
:類似于c風格的強制類型轉換(不安全)
dynamic_cast
:主要用在繼承結構中,可以支持RTTI類型識別的上下轉換
解釋一下dynamic_cast的用法:
class Base{
public:
virtual void func()=0;
};
class Derive1:public Base{
public:
void func() override {
cout<<"Derive1::func()"< (p);
if(dp2!= nullptr){
dp2->funcDerive2();
}else
p->func();
}
int main(){
Derive1 d1;
Derive2 d2;
show(&d1);
show(&d2);
return 0;
}
/*
輸出結果:
Derive1::func()
Derive2::funcDerive2()*/