簡單解析一下OOP編程中常常讓人困惑的幾個名詞。 覆蓋,重寫,重載,隱藏,多態 首先,覆蓋也稱重寫,英文override 特點: 1. 指不同作用域中(派生類和基類)同名函數的定義 2. 函數名、參數均完全相同 3. 基類對應方法前有 virtual,即被聲明為虛函數 作用: 基類指針和引用在調用對應方法時,根據所指對象類型實現動態綁定。 其次,重載(overload) 特點: 1. 作用域,同一類中 2. 函數名相同,但是參數類型、個數等不完全相同 作用: 同一方法,根據傳遞消息的不同(類型或個數),產生不同的動作(相同方法名,實現不同)。 隱藏(遮蔽) 特點: 不同作用域,基類和派生之間 分兩種情形: 一、 基類和派生類函數名相同,但是參數列表不同,不同有無virtual,基類函數在派生類中被隱藏,派生類只能調用新的方法,不能調用已被隱藏的基類方法(不同於重載,作用域不同) 二、 基類與派生類同名,同參,但基類函數無virtual,同樣派生類中同樣隱藏基類的同名同參函數(不同於覆蓋,無virtual) 示例
include <iostream> using namespace std; class base { public: virtual void f(float x) {cout<<"base:f"<<endl; } void g(float x) {cout<<"base:g"<<endl; } void h(float x) {cout<<"base:h"<<endl;} }; class derived : public base { public: virtual void f(float x) {cout<<"derived:f"<<endl; } void g(int x) {cout<<"derived:g"<<endl; } void h(float x) {cout<<"derived:h"<<endl;} }; int main() { derived d; base *pb = &d; derived *pd = &d; cout<<"test override:\n"; pb->f(3.14); pd->f(3.14); cout<<"test hide 1:\n"; pb->g(3.14); pd->g(3.14); cout<<"test hide 2:\n"; pb->h(3.14); pd->h(3.14); return 0; }
分析:覆蓋進行動態綁定,根據基類指針或引用指向的對象類型,調用相應的方法 隱藏進行靜態綁定,取決於 調用的指針或應用類型,而非 基類指針或引用指向的對象類型 使用時,隱藏以產生混淆,應極力避免。 多態 指OOP編程中的一種表現特性。相同消息,作用於同一方法(只是函數名相同),產生的結果不同。 表現方法有 重載,實現接口與繼承 重載中表現為有一對象調用同一個函數名(如add),根據傳遞參數(消息)的不同(如分別為int或float類型),調用不同的方法實現產生不同的結果。 繼承中表現為不同層面中(派生類和基類),對同一函數(同名同參)的調用產生同的結果。