简介:
多级多重继承:
会导致在派生类中可能会有多个相同的基类,因此会影响派生类的大小。所以这个就是一个问题,为了解决这个问题,虚基类就出现了。也就是在相关类前加关键字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仅仅是一个指针。
}