虚拟继承的意义

原创 2002年01月15日 09:30:00

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

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

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


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

C++ 中 虚拟继承 的概念

C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函...
  • CHID
  • CHID
  • 2016年09月29日 15:10
  • 949

C++虚拟多重继承对象模型讨论

C++虚拟多重继承对象模型讨论     作者:magictong 调试环境:Windows7VS2005   概述 记得刚开始写C++程序时,那还是大学时光,感觉这玩意比C强大多了,怎么...
  • magictong
  • magictong
  • 2014年03月26日 19:18
  • 3438

虚拟继承实现原理

网上查了好多篇关于虚拟继承的文章,竟然没有一篇比较系统的介绍虚拟继承的原理、内存分布等情况。没办法,结合自己对于虚拟继承的了解,以及以前大牛们做的贡献在此做一下系统的分析吧^_^虚继承又叫虚拟继承,是...
  • jinri1234
  • jinri1234
  • 2010年06月29日 15:24
  • 1529

关于多重继承和虚拟继承

这两个概念在C++的书里面似乎也很少提及,所以看到这两个名词的时候我也往往自动忽略,今天有时间上网百度了一下,找到三篇写得不错的文章: 《详解多重继承》 《关于C++中的虚拟继承的一些总结》 《详解C...
  • huang1433
  • huang1433
  • 2015年11月02日 14:45
  • 408

VC++对象布局的奥秘:虚函数、多继承、虚拟继承

即派生类继承多次基类,但在派生类中只存在一份基类的拷贝。编译器实现虚拟继承的方式并不相同,下面我结合VS2010来探讨C++虚拟继承 .VC10的隐含编译项/d1reportSingleClassLa...
  • wangqiulin123456
  • wangqiulin123456
  • 2012年10月15日 21:53
  • 3612

多继承与虚拟继承

一、多继承形式: class 派生类名:[继承方式1] 基类名1,[继承方式2] 基类名2,…{//…}; 多继承方式下成员函数名的二义性:多继承方式下,派生类继承了多个基类成员,当两个不同基类拥...
  • jxnu_xx
  • jxnu_xx
  • 2015年07月25日 11:41
  • 303

C++虚继承的内存模型

#include   using namespace std;   class ZooAnimal { public:       virtual void print()       {     ...
  • a627088424
  • a627088424
  • 2015年08月26日 10:43
  • 791

C++中虚继承的作用及底层实现原理

虚继承和虚函数是完全无相关的两个概念。 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可...
  • bxw1992
  • bxw1992
  • 2017年08月30日 22:26
  • 1407

继承*菱形继承与菱形虚拟继承(上)

面向对象程序设计的核心思想是封装(数据抽象)、继承和多态(动态绑定)。 通过使用数据抽象,我们可以将类的接口与实现分离; 使用继承,可以定义相似的类型并对其相似关系建模; 使用动态绑定,可以在一...
  • qq_34992845
  • qq_34992845
  • 2017年02月27日 22:26
  • 936

虚拟继承?

http://blog.csdn.net/wuliming_sc/article/details/3838482 http://hi.baidu.com/luxey/item/624feab0dfa...
  • zhangpinghao
  • zhangpinghao
  • 2012年11月07日 22:25
  • 355
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:虚拟继承的意义
举报原因:
原因补充:

(最多只允许输入30个字)