天天看點

017--C++繼承中虛基類(最優)

簡介:

多級多重繼承:

會導緻在派生類中可能會有多個相同的基類,是以會影響派生類的大小。是以這個就是一個問題,為了解決這個問題,虛基類就出現了。也就是在相關類前加關鍵字virtual.

有兩種用法:一些特殊的情況,必須有多個相同的基類(一般這種情況比較少)

            通常情況下,不需要多個相同的基類(是以引出虛基類的概念)

多級多重繼承(派生類不用關鍵字virtual,派生類對象所占記憶體大小:)

017--C++繼承中虛基類(最優)

//多級多重繼承引出虛基類的問題?什麼是虛基類,虛基類能做什麼。

//多級多重繼承:

//會導緻在派生類中可能會有多個相同的基類,是以會影響派生類的大小。是以這個就是一個問題,為了解決這個問題,虛基類就出現了。也就是在相關類前加關鍵字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,派生類對象所占記憶體大小:)

017--C++繼承中虛基類(最優)

問題:為什麼使用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(結果):

017--C++繼承中虛基類(最優)
#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僅僅是一個指針。
}      

生活會充滿各種不确定的小驚喜············開心········

繼續閱讀