您的位置:首页 > 其它

什么是虚继承?虚基类?

2012-10-15 17:08 169 查看
虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。

类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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class c