1. 程式人生 > >第三十一節 C++ 繼承之如何在派生類中呼叫基類被覆蓋的函式成員(方法)

第三十一節 C++ 繼承之如何在派生類中呼叫基類被覆蓋的函式成員(方法)

#include <iostream>
using namespace std;

/*有些基類的方法在派生類被覆蓋,但有時我們需要呼叫基類的方法。
* 這裡提供了兩種方式去呼叫基類被覆蓋的方法(均使用作用域解析運算子::)。
* 1: 直接在派生類中呼叫被覆蓋的基類方法,如 Person::CheckPerson() ;
* 2:  使用派生類物件呼叫被覆蓋的基類方法,如 Tom.Person::CheckPerson();
*/
class Person {
protected: //只能在派生類內部訪問protected成員,外部不可訪問
	bool man;
public: // public許可權,可被派生類訪問
	void CheckPerson();

	Person(bool initValue) { //建構函式的過載,帶初始值
		man = initValue;
		cout << "Person constructor" << endl;
	}

	~Person() {
		cout << "~Person deconstructor" << endl;
	}
};

void Person::CheckPerson() {
	if (man)
		cout << "Person is man" << endl;
	else
		cout << "Person is woman" << endl;
}

class Man: public Person {  //public繼承,可訪問基類public和protected許可權的成員
public:  
	void CheckPerson(); //覆蓋基類的方法
	Man() : Person(true) {}; //利用初始化列表,對基類的成員進行初始化(基類過載建構函式需要初始化值)
	~Man() {};
};

/*類Man繼承了Person的public和protected成員,這裡覆蓋基類中的函式CheckPerson()*/
void Man::CheckPerson() { //覆蓋基類中的函式CheckPerson()
	if (man) {
		Person::CheckPerson();//使用作用域解運算子::,可呼叫被覆蓋的基類方法
		cout << "calss function is covered: man" << endl;
	}
	else {
		cout << "calss function is covered: woman" << endl;
	}
}

int main()
{
	Man Tom;
	Tom.CheckPerson(); //派生類外部可呼叫繼承的基類public成員
	Tom.Person::CheckPerson(); //使用作用域解運算子::,可呼叫被覆蓋的基類方法
	//Tom.man = false;   //編譯出錯,外部不可修改繼承的protected成員
	return 0;
}

output: 

Person constructor
Person is man
calss function is covered: man
Person is man
~Person deconstructor