C++中多態與虛擬函數的學習

本文內容摘錄自:從零開始學C++程序設計,僅作爲入門使用
如果基類指針指向派生類的對象之後再調用其成員函數,結果仍然是調用到基類的成員函數。
可以通過下面的程序看出來:

#include <iostream>
using namespace std;
class vehicle {
	public:
		void start(){
			cout<<"交通運輸工具啓動"<<endl; 
		}
		void stop(){
			cout<<"交通運輸工具停止"<<endl; 
		}
};
class aircraft:public vehicle{
	public:
		 void start(){
			cout<<"飛行器啓動"<<endl; 
		}
		 void stop(){
			cout<<"飛行器停止"<<endl; 
		}
};
class car: public vehicle {
	public:
			void start(){
			cout<<"汽車啓動"<<endl; 
		}
			void stop(){
			cout<<"汽車停止"<<endl; 
		}
		
};
int main()
{
	vehicle *ve = new vehicle();
	aircraft af;
	car cr;
	ve->start();
	ve->stop();
	delete ve;
	ve = &af;
	ve->start();
	ve->stop();
	ve= &cr;
	ve->start();
	ve->stop();
	return 0;	
}

執行之後的結果如下圖所示:
在這裏插入圖片描述
ar和cr都是由vehicle派生的,雖然基類vehicle的指針指向了ar或cr,但是調用的函數仍然是指向相同存在於基類中的多態函數,並非我們所指定的存在於派生類中的函數。
如果將基類與派生類中的兩個多態改以聲明成爲虛擬函數,則C++的編譯程序會給予這兩個虛擬函數不同的指針,因此程序執行時會按照所給予的指針不同來存取適當的函數。
一旦將函數聲明爲虛擬函數,就必須在派生類中重載該虛擬函數。另外,派生類虛擬函數的參數和返回值還必須與基類中聲明的虛擬函數相同。
聲明方式如下:

virtual 返回類型 函數名稱(參數)

範例程序如下:

#include <iostream>
using namespace std;
class vehicle {
	public:
	virtual void start(){
			cout<<"交通運輸工具啓動"<<endl; 
		}
	virtual	void stop(){
			cout<<"交通運輸工具停止"<<endl; 
		}
};
class aircraft:public vehicle{
	public:
	virtual	 void start(){
			cout<<"飛行器啓動"<<endl; 
		}
	virtual	 void stop(){
			cout<<"飛行器停止"<<endl; 
		}
};
class car: public vehicle {
	public:
	virtual	void start(){
			cout<<"汽車啓動"<<endl; 
		}
	virtual	void stop(){
			cout<<"汽車停止"<<endl; 
		}
		
};
int main()
{
	vehicle *ve = new vehicle();
	aircraft af;
	car cr;
	ve->start();
	ve->stop();
	delete ve;
	ve = &af;
	ve->start();
	ve->stop();
	ve= &cr;
	ve->start();
	ve->stop();
	return 0;	
}

在這裏插入圖片描述純虛擬函數
在聲明虛擬函數時,在表達式的尾端加入語句“=0”,而不加入任何定義該函數功能的語句,這種虛擬函數被稱爲“純虛擬函數”。純虛擬函數最主要的功能是在起始聲明是並未加以定義該虛擬函數的本質而形成一種被保留的函數接口。
抽象基類
純虛擬函數無法在單一類或是派生類中聲明,只能存在於擁有繼承關係的基類中,這種基類稱爲“抽象基類”。
當派生類繼承了抽象基類之後,必須在派生類中“重新定義”及“實現”所繼承的虛擬函數

#include <iostream>
using namespace std;
class vehicle {
	public:
	virtual void start() = 0;
	virtual	void stop() = 0;
};
class aircraft:public vehicle{
	public:
	virtual	 void start(){
			cout<<"飛行器啓動"<<endl; 
		}
	virtual	 void stop(){
			cout<<"飛行器停止"<<endl; 
		}
};
class car: public vehicle {
	public:
	virtual	void start(){
			cout<<"汽車啓動"<<endl; 
		}
	virtual	void stop(){
			cout<<"汽車停止"<<endl; 
		}
		
};
int main()
{
	vehicle *ve ;
	aircraft af;
	car cr;
	ve = &af;
	ve->start();
	ve->stop();
	ve= &cr;
	ve->start();
	ve->stop();
	return 0;	
}

程序運行的結果如下圖所示:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章