C++抽象類

   假設我要作一個調查,各個國家的人的生活習慣,包括吃飯,穿衣,出行……。那麼,很明顯,我能夠構造一個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;
}
相關文章
相關標籤/搜索