虚拟继承的意义

    技术2022-05-11  130

    在类重载中我们一般使用以下的方式:

    class Base{  void Echo() { printf("Echo from Base");}};

    class Middle : public Base {}

    class Child : public Middle {}

    可以很清楚的看出重载过程是 Base->Middle->Child.这样的结构使用默认的重载方式就可以了.

    void main(){  Child c;  c.Echo(); // 正确.}

    但是在某些时候,我们需要从基类分出若干子类,然后再由子类进行多重继承,这个时候以上的方法就会出错.

    比如:

    class Base{  void Echo() { printf("Echo from Base");}};

    class Middle1 : public Base {}class Middle2 : public Base {}

    class Child : public Middle1,Middle2 {}

    void main(){  Child c;  c.Echo(); // 错误.函数调用不明确.}

    这是因为编译时系统认为Middle1和Middle2是两个类体系来自不同的Base类(虽然两个Base声明一模一样),所以在调用Base类的Echo时无法确认指向那一个.

    解决的方法是使用"虚拟继承".

    如下所示:

    class Base{  void Echo() { printf("Echo from Base");}};

    class Middle1 : virtual public Base {}class Middle2 : virtual public Base {}

    class Child : public Middle1,Middle2 {}

    void main(){  Child c;  c.Echo(); // 正确.函数调用来自同一基类.}

    以下图示更能描述默认继承和虚拟继承的区别.

    默认继承:

         base base       |       |       |       |     Mid1 Mid2       |       |           |       Child

    存在两个类体系是出错的原因.

    虚拟继承:

             base           |       |        |     Mid1 Mid2       |        |           |        Child

    使用虚拟继承将类的体系整合起来.

    一点学习的经验,不足之处请指出.


    最新回复(0)