作者: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關鍵字!否則不能通過編譯