什么是虚继承?虚基类?

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。

类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况:

A          A

\          /

  B     C

     \  /

      D

而类D中会出现两次A。为节省内存空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如下图所示情况:

        A

     /      \

   B       C

     \     /

       D

代码如下:

class A;

class B:public virtual A;

class C:public virtual A;

class D:public B,public C;


例子1:

class A
{
   .
   .
   .
   public:
   int a;
   .
   .
   .
};
class B:virtual public A
{
    .
.
.
};
class C:virtual public A
{
    .
.
.
};
class D:public B,public C
{
   public:
   void f(int i)
   {
      a=i;
   }
};

此例中,对于类D而言,类A是类C的虚基类,是类B的真基类;但对于类C而言,类A仍是类C的真基类,虚基类只是一个相对的概念。

如果把上例子稍稍修改一下:

.
.
.
  class D:pbulic C,public B
.
.
.

则对于类D而言,类A是类B的虚基类,是类C的真基类。


#######################################

一个派生类对象的地址可以直接赋给虚基类的指针,不需要强制类型转换。例如:

D obj1;

A *ptr=&obj1;

并且,一个虚基类的引用可以引用一个派生类的对象,反之则不行,无论在强制类型转换中指定什么路径,一个虚基类的指针或引用不能转换为派生类的指针或引用。例如:

D obj2;

A &ref=obj2;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值