第三十一節 C++ 繼承之如何在派生類中呼叫基類被覆蓋的函式成員(方法)
阿新 • • 發佈:2019-02-01
#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