天天看点

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仅仅是一个指针。
}      

生活会充满各种不确定的小惊喜············开心········

继续阅读