这个"virtual"有什么作用?
由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了。
典型的需要用虚基类的情况如下:
其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承,即多继承中经常提到的“菱形结构”。
#include<stdio.h>
class A
{
public:
void Echo()
{
printf( "Echo");
}
};
class B: public A
{
};
class C: public A
{
};
class D: public B, public C
{
};
void main()
{
D d;
d.Echo(); // 出现错误.此处函数调用不明确.
}
此时调用d.Echo(),就会有二义性问题,编译器会报Echo函数调用不明确,如下:
如果将B、C类改为像如下那样从A类虚拟继承,则不会存在有二义性问题,编译器不会报错。
#include<stdio.h>
class A
{
public:
void Echo()
{
printf( "Echo");
}
};
class B: public virtual A
{
};
class C: virtual public A
{
};
class D: public B, public C
{
};
int main()
{
D d;
d.Echo(); // 正确,编译器不会报错.
return 0;
}
说明:public virtual写成virtual public也是可以的,即public、 virtual关键字谁在前谁在后都行。