中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中覆蓋和隱藏的示例分析

發布時間:2021-08-30 13:46:20 來源:億速云 閱讀:134 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關C++中覆蓋和隱藏的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1. 前言

繼承是面向對象編程的重要特性,在c++中,當父類與子類出現同名函數時,會出現兩種情況:覆寫和隱藏

2. 共性

當子類繼承父類,并且子類中有父類同名函數,那么子類將隱藏父類中所有同名函數,不可以對父類中同名函數直接進行訪問,此時子類調用父類中函數需要用域操作符::

#include<iostream>
using namespace std;
class A{
	public:
		void fun1(){
			cout<<"A::fun1()"<<endl;
		}
		void fun1(int){
			cout<<"A::fun1(int)"<<endl;
		}
		void fun2(){
			cout<<"A::fun2()"<<endl;
		}
};
class B:public A{
	public:
		void fun1(){
			cout<<"B::fun1()"<<endl;
		}
};
int main(){
	B b;
	b.fun1();//調用子類b的fun1()函數
    //b.fun1(3);嘗試調用父類fun1(int)函數會報錯:error:no matching function for call to 'B::fun1(int)'
	b.A::fun1();//調用父類A的fun1()函數
	b.A::fun1(3);//調用父類A的fun1(int)函數
	b.fun2();//調用父類A的fun2()函數
	return 0;
}

C++中覆蓋和隱藏的示例分析

b調用fun1()函數,會調用子類b的fun1()函數,而嘗試使用b.fun(3)調用父類的void fun(int)函數時,會報錯,因為父類中的同名函數都被隱藏。此時調用父類中函數的方法是使用域操作符::。

當父類中同名函數擁有virtual修飾符修飾時,此時子類對父類函數進行覆寫

#include<iostream>
using namespace std;
class A{
	public:
		virtual void fun1(){
			cout<<"A::fun1()"<<endl;
		}
		void fun1(int){
			cout<<"A::fun1(int)"<<endl;
		}
		void fun2(){
			cout<<"A::fun2()"<<endl;
		}
};
class B:public A{
	public:
		virtual void fun1(){
			cout<<"B::fun1()"<<endl;
		}
};
int main(){
	B b;
	b.fun1();//調用子類b的fun1()函數
    //b.fun1(3);嘗試調用父類fun1(int)函數會報錯:error:no matching function for call to 'B::fun1(int)'
	b.A::fun1();//調用父類A的fun1()函數
	b.A::fun1(3);//調用父類A的fun1(int)函數
	b.fun2();//調用父類A的fun2()函數
	return 0;
}

C++中覆蓋和隱藏的示例分析

可見即使是虛函數覆寫,也會隱藏父類中的所有同名函數。

當子類與父類有同名函數,無論是覆寫還是隱藏的方式,在子類自身進行函數調用時,會調用子類函數而隱藏父類的所有同名函數,要訪問父類函數需要通過域操作符進行訪問。

3. 區別

覆寫與隱藏的區別可以體現在基類指針的使用上,比如以下程序

#include<iostream>
using namespace std;
class A{
	public:
		void function1(){
			cout<<"A::function1"<<endl;
		}
		virtual void function2(){
			cout<<"A::function2"<<endl;
		}
};
class B:public A{
	public:
		//隱藏基類function1
		void function1(){
			cout<<"B::function1"<<endl;
		}
};
class C:public A{
	public:
		//覆寫基類function2
		virtual void function2(){
			cout<<"C::function2"<<endl;
		}
};
int main(){
	A *a;
	B b;
	C c;
	a=&b;
	a->function1();
	a=&c;
	a->function2();
	return 0;
}

C++中覆蓋和隱藏的示例分析

b隱藏基類的同名函數function1(),當基類指針a指向子類b時,調用的是a的function1()函數,而子類c覆寫a的同名函數function2(),當基類a指針指向子類c,調用的是c的function2()函數。

利用覆寫的特點,可以實現c++的多態特性。

4. 區分

隱藏:當父類函數與派生類函數同名,并且父類函數無virtual關鍵字修飾,無論父類與派生類參數個數與類型是否相同,此時派生類函數隱藏父類所有同名函數

覆寫:當父類函數與派生類函數同名,并且參數相同,返回值相同,并且父類函數有virtual關鍵字修飾,此時派生類函數覆寫父類函數

感謝各位的閱讀!關于“C++中覆蓋和隱藏的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

沂水县| 和政县| 临颍县| 宣恩县| 河曲县| 新沂市| 肃北| 临邑县| 光泽县| 钟山县| 安新县| 鄂温| 阜平县| 叙永县| 文登市| 多伦县| 裕民县| 乳源| 岑溪市| 乌鲁木齐市| 兴安盟| 新昌县| 玉屏| 临城县| 同江市| 龙口市| 蓬溪县| 渝北区| 绥江县| 周至县| 观塘区| 加查县| 洛南县| 丹棱县| 舞阳县| 勃利县| 鸡西市| 策勒县| 兴文县| 池州市| 青铜峡市|