C++学习笔记:关键字virtual 虚继承
(依旧是程设2的笔记)
普通继承与虚继承,只有在派生类重复继承某一基类时,才有区别。virtual可以使派生类在重复继承一个基类时,只产生唯一的一份基类副本。如上图,当B,C的继承代码为:
class B:virtual public A{};
class C: virtual public A{};
此时D只会继承一份A,而不会通过B,C重复继承了。此时A即为虚基类。
那么虚继承的本质是什么呢?
给出了以下代码:
#include<iostream>
using namespace std;
class A{};
class B:public A{};
class C:public A{};
class D:public B,public C{};
int main(){
cout<<"sizeof A is "<<sizeof(A)<<endl;
cout<<"sizeof B is "<<sizeof(B)<<endl;
cout<<"sizeof C is "<<sizeof(C)<<endl;
cout<<"sizeof D is "<<sizeof(D)<<endl;
}
输出为:
sizeof A is 1
sizeof B is 1
sizeof C is 1
sizeof D is 2
再看以下代码:
#include<iostream>
using namespace std;
class A{};
class B:virtual public A{};
class C:virtual public A{};
class D:public B,public C{};
int main(){
cout<<"sizeof A is "<<sizeof(A)<<endl;
cout<<"sizeof B is "<<sizeof(B)<<endl;
cout<<"sizeof C is "<<sizeof(C)<<endl;
cout<<"sizeof D is "<<sizeof(D)<<endl;
}
输出为:
sizeof A is 1
sizeof B is 8
sizeof C is 8
sizeof D is 16
我们注意到,在普通继承中,B,C的大小与A相同。而虚继承中,B,C的大小为8字节,这说明虚基类的派生类包含的其实是指向虚基类的指针。