程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 覆蓋,重寫,重載,隱藏,多態的區別

覆蓋,重寫,重載,隱藏,多態的區別

編輯:C++入門知識

簡單解析一下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類型),調用不同的方法實現產生不同的結果。   繼承中表現為不同層面中(派生類和基類),對同一函數(同名同參)的調用產生同的結果。    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved