当前位置: 首页 > 业界动态 > 技术实现 > 本文


C语言中虚继承与继承的差异




发布时间: 2012-10-16 11:02:45  
    首先,重复一下虚拟继承与普通继承的区别有:

  假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;

  假设derived 虚继承自base类,那么derivd与base是一种“has a”的关系,即derived类有一个指向base类的vptr.

  因此虚继承可以认为不是一种继承关系,而可以认为是一种组合的关系。因为虚继承有着“继承”两个关键字,那么大部分人都认为虚继承与普通继承的用法没什么太大的不同。由此用在继承体系中,这种将虚继承认为是普通继承的危害更佳大。下面先用一个例子来说明问题:

  class base

  {

  public:

  base(){cout《“base::base()!”《endl;}

  void printBase(){cout《“base::printBase()!”《endl;}

  };

  class derived:public base

  {

  public:

  derived(){cout《“derived::derived()!”《endl;}

  void printDerived(){cout《“derived::printDerived()!”《endl;}

  };

  上面是普通继承实现,在实际应用中,我们可以使用下面的代码进行类型转换:

  int main(int argc, const char * argv[])

  {

  derived oo;

  base oo1(static_cast(oo));

  oo1.printBase();

  derived oo2 = static_cast(oo1);

  oo2.printDerived();

  return 0;

  }

  编译无错误,而且会得出正确的结果。其结果为:

  base::base()!

  derived::derived()!

  base::printBase()!

  derived::printDerived()!

  而将上面的普通继承变成虚拟继承,如下代码:

  class base1

  {

  public:

  base1(){cout《“base::base()!”《endl;}

  void printBase(){cout《“base::printBase()!”《endl;}

  };

  class derived1:virtual public base1

  {

  public:

  derived1(){cout《“derived::derived()!”《endl;}

  void printDerived(){cout《“derived::printDerived()!”《endl;}

  };

  int main(int argc, const char * argv[])

  {

  derived1 oo;

  base1 oo1(static_cast(oo));

  oo1.printBase();

  derived1 oo2 = static_cast(oo1);

  oo2.printDerived();

  return 0;

  }

  编译上面的代码,

  可以看到不能将基类通过static_cast转换为继承类。我们知道c++提供的强制转换函数static_cast对于继承体系中的类对象的转换一般是可行的。那么这里为什么就不可以了呢?还是需要从虚拟继承的内部实现来说明问题。

  virtual base class的原始模型是在class object中为每一个有关联的virtual base class加上一个指针vptr,该指针指向virtual基类表。有的编译器是在继承类已存在的virtual table直接扩充导入一个virtual base class table.不管怎么样由于虚继承已完全破坏了继承体系,不能按照平常的继承体系来进行类型转换。

  不管怎么样,虚继承在类型转换是一定要十分注意。不要轻易使用虚继承,更不要在虚继承的基础上进行类型转换,切记切记!

    本文来源:比特网

 

    相关文章推荐:C语言入门 枚举与位运算

分享到:
阅读:1532次
推荐阅读:

版权所有 © 2011-2016 南京云创大数据科技股份有限公司(股票代码:835305), 保留一切权利。(苏ICP备11060547号-1)  
云创大数据-领先的云存储、大数据、云计算产品供应商