作者:Horsetail
先看看下面这个程序先:
#include <iostream>
#include <stdio.h>
class A{
public:
A(){std::cout<<"here is class A"<<std::endl;}
A(int a){std::cout<<a<<std::endl;}
void fun(){std::cout<<"Ten FUN in the A"<<std::endl;return;}
};
class B:public A{
public:
void fun(){std::cout<<"Ten FUN in the B"<<std::endl;return;}
B():A(0){std::cout<<"here is class B"<<std::endl;}
};
struct C:A,B{ C():A(1){std::cout<<"here is class C"<<std::endl;}
};
//
int main()
{
C c;
char i=0;
getchar();
return 0;
}
编译器可以通过编译,但是当我们在main()函数中调用基类A中的fun()函数时,就出错了!因为在B类中也继承了A类,当在main()中调用fun时,编译器不能确定是直接调用A类中的fun()还是通过A类的继承类B间接调用A类中的fun()!因此,在我们继承成员中如果有相同的父类,我们应该声明虚继承!
在虚继承的同时,我们还应该注意下面这个问题:
当我们多虚继承一个类时如果在基类集中存在两个或两个以上同样的基类且其中有一个基类使用了virtual关键字。则其余相同的基类必须全部都要用virtual关键字!否则不能通过编译