簡介:
多級多重繼承:
會導緻在派生類中可能會有多個相同的基類,是以會影響派生類的大小。是以這個就是一個問題,為了解決這個問題,虛基類就出現了。也就是在相關類前加關鍵字virtual.
有兩種用法:一些特殊的情況,必須有多個相同的基類(一般這種情況比較少)
通常情況下,不需要多個相同的基類(是以引出虛基類的概念)
多級多重繼承(派生類不用關鍵字virtual,派生類對象所占記憶體大小:)
//多級多重繼承引出虛基類的問題?什麼是虛基類,虛基類能做什麼。
//多級多重繼承:
//會導緻在派生類中可能會有多個相同的基類,是以會影響派生類的大小。是以這個就是一個問題,為了解決這個問題,虛基類就出現了。也就是在相關類前加關鍵字virtual.
//有兩種用法:一些特殊的情況,必須有多個相同的基類(一般這種情況比較少)
//通常情況下,不需要多個相同的基類(是以引出虛基類的概念)
//----------------------------------------------
//
#include<iostream>
using namespace std;
class CA{
public:
int temp;
public:
CA(){
}
~CA(){}
};
class CB:public CA{
public:
int temp;
public:
CB(){
}
~CB(){}
};
class CD :public CA{
public:
int temp;
public:
CD(){
}
~CD(){}
};
class CE :public CB,public CD{
public:
int temp;
public:
CE(){
}
~CE(){}
};
int main(){
CE e;
cout <<"記憶體所占大小:"<<sizeof(e) << endl;;//如果沒有用virtual,(即虛繼承),那麼派生類的記憶體将有
//兩個基類所占用的記憶體,即基類記憶體重複了,導緻派生類記憶體變大。為了
//解決這個問題,那麼C++就引出了虛基類的概念,以此減少派生類的資料所占記憶體大小。
}
多級多重繼承(派生類使用關鍵字virtual,派生類對象所占記憶體大小:)
問題:為什麼使用virtual這個關鍵字,派生類對象所占記憶體變大了呢?一個virtual即是一個指針,它将占據一個四位元組記憶體。
#include<iostream>
using namespace std;
class CA{
public:
int temp;
public:
CA(){
}
~CA(){}
};
class CB:virtual public CA{
public:
int temp;
public:
CB(){
}
~CB(){}
};
class CD :virtual public CA{
public:
int temp;
public:
CD(){
}
~CD(){}
};
class CE :public CB,public CD{
public:
int temp;
public:
CE(){
}
~CE(){}
};
int main(){
CE e;
cout <<"記憶體所占大小:"<<sizeof(e) << endl;;//如果用了virtual,(即虛繼承),那麼派生類的記憶體将隻
//占用一個基類的記憶體,是以派生類的記憶體将減小。
//如果在類中有一個virtual 關鍵字,那麼這個類将加一個四位元組記憶體。
//有幾個關鍵字virtual,就加上幾個四位元組記憶體。
//同時,virtual僅僅是一個指針。
}
以上問題,是由于基類中成員資料太少了,導緻看不出具體變化,現在在基類中聲明四個成員變量。你将看到明确的結果;
首先不加關鍵字virtual(結果):
#include<iostream>
using namespace std;
class CA{
public:
int temp;
int a;
int b;
int c;
public:
CA(){
}
~CA(){}
};
class CB:virtual public CA{
public:
int temp;
public:
CB(){
}
~CB(){}
};
class CD :virtual public CA{
public:
int temp;
public:
CD(){
}
~CD(){}
};
class CE :public CB,public CD{
public:
int temp;
public:
CE(){
}
~CE(){}
};
int main(){
CE e;
cout <<"記憶體所占大小:"<<sizeof(e) << endl;;//如果用了virtual,(即虛繼承),那麼派生類的記憶體将隻
//占用一個基類的記憶體,是以派生類的記憶體将減小。
//如果在類中有一個virtual 關鍵字,那麼這個類将加一個四位元組記憶體。
//有幾個關鍵字virtual,就加上幾個四位元組記憶體。
//同時,virtual僅僅是一個指針。
}