Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 22:40:33
visual c++中虚基类的用法

visual c++中虚基类的用法

visual c++中虚基类的用法

在多重继承中,经常会出现这种情况,类B和类C都是类A的派生类,而类D又是类B和类C的派生类,如图1所示。




图1 多重继承示意图

由于Class B和Class C都是Class A的派生类,它们都继承了Class A的特征,Class D是从Class B和Class C继承而来,这样,Class D中就继承了两次Class A的特征,当试图通过派生类对象直接访问基类A的成员时,将会导致编译时二义性错误。


#include "iostream.h"
class ClassA
{
public:
int a;
};
class ClassB:public ClassA
{
public:
int b;
};
class ClassC:public ClassA
{
public:
int c;
};
class ClassD : public ClassB,public ClassC
{
public:
int d;
};
void main()
{
ClassD example;
example.a=100;
}

这段代码中存在的二义性错误,由于编译器不知道“example.a”是从Class B继承下来的“a”还是从Class C继承下来的“a”。如果希望通过编译,就需要指定“a”是从哪个类间接派生而来的。


example.ClassB::a=100;

或:


example.ClassC::a=100;

从上面的例子中读者可以看出,上面这种情况不但浪费了存储空间(继承了两次Class A的特征),在访问成员时也较麻烦。为了解决这个问题,引出了虚基类的概念。

首先,读者要明确,虚基类并不是一种新型的类,而是一种派生方式。如果采用虚基类方式定义派生类,则在创建派生类对象时,类层次结构中某个虚基类的成员只出现一次,即基类的副本被所有派生类对象共享。

采用虚基类方式定义派生类的方法是在基类名的前面加上关键字virtual,而定义基类时不需要使用关键字virtual。

更改一下上面的例子:

……


class ClassB:public virtual ClassA
{
public:
int b;
};
class ClassC:public virtual ClassA
{
public:
int c;
};

……

无论采用哪种方式多重继承,虚基类的数据成员只生成一份。虚基类的使用既节约了内存空间,又避免了在多重派生类中类成员的不明确性。



If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759