作者:Horsetail
先看看下面這個(gè)程序先:
#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;
}
????????編譯器可以通過編譯,但是當(dāng)我們?cè)趍ain()函數(shù)中調(diào)用基類A中的fun()函數(shù)時(shí),就出錯(cuò)了!因?yàn)樵贐類中也繼承了A類,當(dāng)在main()中調(diào)用fun時(shí),編譯器不能確定是直接調(diào)用A類中的fun()還是通過A類的繼承類B間接調(diào)用A類中的fun()!因此,在我們繼承成員中如果有相同的父類,我們應(yīng)該聲明虛繼承!
在虛繼承的同時(shí),我們還應(yīng)該注意下面這個(gè)問題:
?????????當(dāng)我們多虛繼承一個(gè)類時(shí)如果在基類集中存在兩個(gè)或兩個(gè)以上同樣的基類且其中有一個(gè)基類使用了virtual關(guān)鍵字。則其余相同的基類必須全部都要用virtual關(guān)鍵字!否則不能通過編譯