1. 程式人生 > >在成員函數中調用虛函數(關於多態的註意事項)------新標準c++程序設計

在成員函數中調用虛函數(關於多態的註意事項)------新標準c++程序設計

通過 rtu blog 析構 多態 space str ret public

  類的成員函數之間可以互相調用。在成員函數(靜態成員函數、構造函數和析構函數除外)中調用其他虛成員函數的語句是多態的。例如:

#include<iostream>
using namespace std;
class CBase
{
	public:
		void func1()
		{
			func2();
		}
		virtual void func2(){cout<<"CBase::func2()"<<endl;}
};
class CDerived:public CBase
{
	public:
		virtual void func2(){cout<<"CDeriver::func2()"<<endl;}
};
int main()
{
	CDerived d;
	d.func1();
	return 0;
}

  輸出:

CDeriver::func2()

  第20行調用func1成員函數。進入func1成員函數,執行到第8行,調用func2函數。看起來調用的應該是CBase類的func2成員函數,但輸出結果證明實際上調用的是CDerived類的func2成員函數。這是因為,在func1函數中,“func2();”等價於“this->func2();”,而this指針顯然是CBase*類型的,即是一個基類指針,那麽“this->func2();”就是在通過基類指針調用虛函數,因此這條函數調用語句就是多態的。當本程序執行到第8行時,this指針指向的是一個CDerivrd類的對象,即d,因此被調用的是CDerived類的func2成員函數。

新標準c++程序設計

在成員函數中調用虛函數(關於多態的註意事項)------新標準c++程序設計