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++面向對象法式設計有所贊助。