程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中重載、重寫(籠罩)和隱蔽的差別實例剖析

C++中重載、重寫(籠罩)和隱蔽的差別實例剖析

編輯:關於C++

C++中重載、重寫(籠罩)和隱蔽的差別實例剖析。本站提示廣大學習愛好者:(C++中重載、重寫(籠罩)和隱蔽的差別實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中重載、重寫(籠罩)和隱蔽的差別實例剖析正文


本文實例講述了C++中重載、重寫(籠罩)和隱蔽的差別,關於C++面向對象法式設計來講長短常主要的概念。詳細剖析以下:

1.重載:重載從overload翻譯過去,是指統一可拜訪區內被聲明的幾個具有分歧參數列(參數的類型,個數,次序分歧)的同名函數,依據參數列表肯定挪用哪一個函數,重載不關懷函數前往類型。

示例代碼以下:

class A{
public:
  void test(int i);
  void test(double i);
  void test(int i, double j);
  void test(double i, int j);
  int test(int i);         //毛病,非重載
};

前四個互為重載函數,最初一個和第一個不是重載函數。

2.隱蔽:隱蔽是指派生類的函數屏障了與其同名的基類函數。留意只需同名函數,不論參數列表能否雷同,基類函數都邑被隱蔽。

實例代碼以下:

#include<iostream>
using namespace std;
class A{
public:
  void fun1(int i, int j){
    cout << "A::fun1() : " << i << " " << j << endl;
  }

};
class B : public A{
public:
    //隱蔽
  void fun1(double i){
    cout << "B::fun1() : " << i << endl;
  }
};
int main(){
  B b;
    b.fun1(5);          //挪用B類中的函數
  b.fun1(1, 2);        //失足,由於基類函數被隱蔽
  system("pause");
  return 0;
}    

3.重寫:重寫翻譯自override,也翻譯成籠罩(更好一點),是指派生類中存在從新界說的函數。其函數名,參數列表,前往值類型,一切都必需同基類中被重寫的函數分歧。只要函數體分歧(花括號內),派生類挪用時會挪用派生類的重寫函數,不會挪用被重寫函數。重寫的基類中被重寫的函數必需有virtual潤飾。

實例代碼以下:

#include<iostream>
using namespace std;
class A{
public:
  virtual void fun3(int i){
    cout << "A::fun3() : " << i << endl;
  }

};
class B : public A{
public:
    //重寫
  virtual void fun3(double i){
    cout << "B::fun3() : " << i << endl;
  }
};
int main(){
    A a;
  B b;
  A * pa = &a;
  pa->fun3(3);
  pa = &b;
  pa->fun3(5);
  system("pause");
  return 0;
}

下面為虛函數完成多態的代碼,不明確的先看虛函數完成多態的道理。

重載和重寫的差別:

(1)規模差別:重寫和被重寫的函數在分歧的類中,重載和被重載的函數在統一類中。

(2)參數差別:重寫與被重寫的函數參數列表必定雷同,重載和被重載的函數參數列表必定分歧。

(3)virtual的差別:重寫的基類必需要有virtual潤飾,重載函數和被重載函數可以被virtual潤飾,也能夠沒有。

隱蔽和重寫,重載的差別:

(1)與重載規模分歧:隱蔽函數和被隱蔽函數在分歧類中。

(2)參數的差別:隱蔽函數和被隱蔽函數參數列表可以雷同,也能夠分歧,但函數名必定同;當參數分歧時,不管基類中的函數能否被virtual潤飾,基類函數都是被隱蔽,而不是被重寫。

調試運轉以下代碼:

#include<iostream>
using namespace std;
class A{
public:
  void fun1(int i, int j){
    cout << "A::fun1() : " << i << " " << j << endl;
  }
  void fun2(int i){
    cout << "A::fun2() : " << i << endl;
  }
  virtual void fun3(int i){
    cout << "A::fun3(int) : " << i << endl;
  }
};
class B : public A{
public:
    //隱蔽
  void fun1(double i){
    cout << "B::fun1() : " << i << endl;
  }
    //重寫
  void fun3(int i){
    cout << "B::fun3(int) : " << i << endl;
  }
    //隱蔽
  void fun3(double i){
    cout << "B::fun3(double) : " << i << endl;
  }
};
int main(){
  B b;
  A * pa = &b;
  B * pb = &b;
  pa->fun3(3);        //重寫,多態性,挪用B的函數
  b.fun3(10);         //隱蔽,挪用B的函數
  pb->fun3(20);       //隱蔽,挪用B的函數
  system("pause");
  return 0;
}

輸入成果為:

B::fun3(int) : 3
B::fun3(int) : 10
B::fun3(int) : 20
請按隨意率性鍵持續. . .

願望本文所述對年夜家C++面向對象法式設計有所贊助。

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