虚继承是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。
虚继承可以使得虚基类对于由它直接或间接派生的类来说,拥有一个共同的基类对象实例。避免由于带有歧义的组合而产生的问题(如“菱形继承问题”)。
例1:
#include <iostream> using namespace std; class A { int a; virtual void f(){}; }; class B : public virtual A { int b; virtual void f(){}; }; class C: public virtual A { int c; virtual void f(){}; }; void main() { cout << sizeof(A) << endl; //大小:8字节 cout << sizeof(B) << endl; //大小:16字节 cout << sizeof(C) << endl; //大小:24字节 }各类的字节占用情况如下表所示:
类A类B类C类A的虚函数表指针(4字节)类B的虚函数表指针(4字节)类C的虚函数表指针(4字节)整数a(4字节)整数b(4字节)整数c(4字节) 类B指向类A的虚类指针(4字节)类C指向类B的虚类指针(4字节) 整数a(4字节)整数b(4字节) 类C指向类A的虚类指针(4字节) 整数a(4字节)例2:菱形继承
class A { int a; }; class B : virtual public A { }; class C : virtual public A { }; class D: public B, public C { }; void main() { cout<<sizeof(A)<<endl; //大小:4字节 cout<<sizeof(B)<<endl; //大小:8字节 cout<<sizeof(C)<<endl; //大小:8字节 cout<<sizeof(D)<<endl; //大小:12字节 }各类的字节占用情况如下表所示:
类A类B类C类D整数a(4字节)类B指向类A的虚类指针(4字节)类C指向类A的虚类指针(4字节)类B指向类A的虚类指针(4字节) 整数a(4字节)整数a(4字节)类C指向类A的虚类指针(4字节) 整数a(4字节)例3:菱形继承拓展
class A { int a; }; class B : virtual public A { }; class C : virtual public A { }; class D: virtual public B, virtual public C { }; void main() { cout<<sizeof(A)<<endl; //大小:4字节 cout<<sizeof(B)<<endl; //大小:8字节 cout<<sizeof(C)<<endl; //大小:8字节 cout<<sizeof(D)<<endl; //大小:16字节 }各类的字节占用情况如下表所示:
类A类B类C类D整数a(4字节)类B指向类A的虚类指针(4字节)类C指向类A的虚类指针(4字节)类D指向B、C的虚类指针(4字节) 整数a(4字节)整数a(4字节)类B指向类A的虚类指针(4字节) 类C指向类A的虚类指针(4字节) 整数a(4字节)例4:
class A { virtual void func(); }; class B : public virtual A { virtual void func(); }; void main() { cout<<sizeof(A)<<endl; //大小:4字节 cout<<sizeof(B)<<endl; //大小:8字节 }各类的字节占用情况如下表所示:
类A类B类A的虚函数表指针(4字节)类B的虚函数表指针(4字节) 类B指向类A的虚类指针(4字节)1. C++多继承和虚继承的内存布局
