虚继承

    xiaoxiao2023-10-22  174

    1. 前情提要

    虚继承是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。

    虚继承可以使得虚基类对于由它直接或间接派生的类来说,拥有一个共同的基类对象实例。避免由于带有歧义的组合而产生的问题(如“菱形继承问题”)。

    2. 示例

    例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字节)

    3. 参考

    1. C++多继承和虚继承的内存布局

     

    最新回复(0)