假設我要作一個調查,各個國家的人的生活習慣,包括吃飯,穿衣,出行……。那麼,很明顯,我能夠構造一個Human類來定義這些東西。可是,由於,我要調查的是各個國家的生活習慣,因此,我確定不能用Human來實例話對象。因而,我會派生出子類。好比,英國人,中國人等等。既然,我建立的Human類,不用來實例化對象,那麼我也沒有必要在Human類中將功能具體實現出來。因此,我能夠直接在函數前加上,virtual,而且將函數賦值爲0,對於這樣的函數,叫作純虛函數。例如,
ide
virtual void eating ( void ) = 0; //純虛函數
對於那些擁有純虛函數的類叫作,抽象類。抽象類是不能實例話對象的。好比,如今我來實現一個抽象類,
函數
class Human { //抽象類不能實例化對象 public: virtual void eating(void) = 0; virtual void wearing(void) = 0; virtual void driving(void) = 0; virtual Human* test(void) { cout << "Human's test" << endl; return this; } ~Human(void) { cout << "~Human" << endl; } };
那麼,我如今須要在抽象類的基礎上,派生出其子類,而且,在子類中覆寫全部純虛函數。好比,我如今派生出一個新的子類,Englishman這個子類。
this
class Englishman : public Human { public: void eating(void) { cout << "use knife to eat" << endl; } void wearing(void) { cout << "wear English style" << endl; } void driving(void) { cout << "drive English car" << endl; } ~Englishman(void) { cout << "~Englishman" << endl; } virtual Englishman* test(void) { cout << "English's test" << endl; return this; } };
這時,父類中的全部純虛函數都在子類中覆寫了,那麼,此時,Englishman類能夠實例化對象了。
對象
假設,我如今,又派生出一個Chinese類,
it
class Chinese : public Human { public: void eating(void) { cout << "use chopstick to eat" << endl; } /*void wearing(void) { //若是,Chinese沒有實現wearing函數,那麼 //這個函數仍然是個純虛函數,仍是不能實現,也就是說,Chinese仍然是個抽象類, //不能實例化對象。 cout << "wear Chinese style" << endl; }*/ void driving(void) { cout << "drive Chinese car" << endl; } ~Chinese(void) { cout << "~Chinese" << endl; } virtual Chinese* test(void) { cout << "Chinese test" << endl; return this; } };
此時,父類中的純虛函數wearing()並無在子類Chinese中獲得覆寫。因此,此時,Chinese類依然不能實例化對象。若是一個子類沒有覆寫完父類的全部純虛函數,那麼這個子類仍然不能實例化對象。必須派生處新的子類,直到全部純虛函數覆寫完畢爲止。那麼咱們如今來派生出新的子類,class
class Guangximan : public Chinese { public: void wearing(void) { cout << "wear Guangxi's style" << endl; } };
這時,Guangximan能夠實例化對象了。test
int main( int argc, char** argv ) { Englishman e; e.eating(); //Chinese c; //error Guangximan gc; gc.wearing(); system("pause"); return 0; }