C++ Primer — const小問題

#include <iostream>
using namespace std;

class Base
{
	public:
		virtual void display() const
		{ 
		   cout << "Base class !" << endl; 
		}
		virtual ~Base(){}
};

class Derive: public Base
{
	public:
		virtual void display()
		{ 
		   cout << "Derive class !"<< endl; 
		}
		virtual ~Derive(){}
};

int main()
{
	Base* pBase = new Derive();	
	Derive* pDerive = new Derive();		
	pBase->display();
	pDerive->display();
	delete pBase;
	delete pDerive;
        //const Derive d;
        //d.display();//編譯錯誤
	return 0;}

該程序會輸出:Base class和Derive class。但是如果在子類成員函數加上const的話,輸出爲2個Derive class。還可以父類不加const,子類加const等。

註解:基類和派生類的display函數一個帶const,一個不帶const,雖然基類中disppaly()函數爲虛函數,但是派生類中的dispaly()函數沒有const修飾,也就是說派生類中的display()函數,並不是對基類中display()函數的重新定義,派生類中有2個版本的display()函數,一個是繼承基類的,一個是自己的,我們不能通過Derive的對象(引用或指針)調用從Base繼承的虛函數,因爲該函數被Derive中的display()定義屏蔽了,pBase是基類類型的指針,它指向派生類,當調用display()函數時,這是不會發生動態綁定,編譯器將在基類中查找該函數,而忽略派生類;若將派生類中的dispay()函數加上const修飾,即對display()函數進行重定義,則當通過基類類型的指針調用dispaly()函數時,此時發生動態綁定,會根據基類類型的指針實際指向的對象來調用相應的函數,故此時會輸出2個Derive class

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