派生類生成一個對象時姿搜,基類與子類在內(nèi)存中的排列狀態(tài):
當(dāng)子類中定義的成員變量與父類的成員變量同名時笤昨,由于構(gòu)造函數(shù)是從最初始的基類開始構(gòu)造,各個類的同名變量沒有形成覆蓋停士,父類的成員方法操作的是本類的成員變量肚医,而不會是子類或者基類的。
class A{
protected:
int m_data;
public:
A(int data=0){ m_data=data; }
int GetData(){ return doGetData(); }
virtual int doGetData(){ return m_data; }
};
class B: public A{
protected:
int m_data;
public:
B(int data=1){ m_data=1; }
int doGetData(){ return m_data; }
};
class C: public B{
protected:
int m_data;
public:
C(int data=2){ m_data=data; }
};
int main(){
C c(10);
cout<<c.GetData()<<endl; //結(jié)果為1
cout<<c.A::GetData()<<endl; //結(jié)果為1
cout<<c.A::doGetData()<<endl; //結(jié)果為0
system("pause");
return 0;
}
基類中含有虛函數(shù)向瓷,則該類中會有一個vfptr肠套,指向虛函數(shù)表,所以其大小除了數(shù)據(jù)成員外猖任,還有一個指針你稚。
子類繼承該基類后,則大小為數(shù)據(jù)成員+指針+上面的基類大小朱躺。
class A{
char k[3];
public:
virtual void aa(){};
};
class B : public A{
char j[3];
public:
vitual void bb(){};
}
int main(){
cout<<sizeof(A)<<endl; //8
cout<<sizeof(B)<<endl; //16
}
虛繼承是多重繼承中特有的概念刁赖,是為解決多重繼承出現(xiàn)的可能兩個父類同時繼承了一個相同基類的問題。
聲明一個多重繼承 : class JetPlane : public Rocket, public Airplane
class A{
int m_nA;
};
class B: public A{
int m_nB;
};
class C: public A,public B{
int m_nC;
};
int main(){
C* pC=new C;
B* pB=dynamic_cast<B*>(pC);
if(pB==pC){
cout<<"equal"<<endl;
}else{
cout<<"not equal"<<endl;
}
if(int(pC)==int(pB)){
cout<<"equal"<<endl;
}else{
cout<<"not equal"<<endl;
}
return 0;
}
上題中长搀,在執(zhí)行pB==pC時宇弛,會進(jìn)行隱式類型轉(zhuǎn)換,所以等價于(C*)pB==pC源请,這樣之前pB所指向的同一C對象的B部分就轉(zhuǎn)而指向pC指向的地址枪芒,兩者相等。
執(zhí)行int(pC)==int(pB)時谁尸,由于兩者指向部分不同舅踪,C是先繼承A后繼承B的,所以int轉(zhuǎn)型后值肯定會不同良蛮。但如果C先繼承B后繼承A抽碌,則值相同,應(yīng)該是都指向起始地址决瞳。
類繼承時货徙,如果不指定繼承方式,則默認(rèn)為private皮胡。
純虛類不能實例化對象痴颊。
虛指針或者虛函數(shù)指針是虛函數(shù)的一個實現(xiàn)細(xì)節(jié),帶有虛函數(shù)的類的每一個對象都有一個虛指針指向該類的虛函數(shù)表胸囱,位于對象的頭部祷舀。