欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析C++中的重載,隱藏和覆蓋

 更新時(shí)間:2022年12月08日 11:21:33   作者:Hello_Bugs  
在C++語(yǔ)言中,函數(shù)扮演著很重要的角色,不管面向過(guò)程設(shè)計(jì),還是基于對(duì)象設(shè)計(jì)。本文主要為大家介紹了函數(shù)中重載、覆蓋和隱藏的相關(guān)知識(shí),感興趣的小伙伴可以了解一下

重載關(guān)系

一組函數(shù)要重載,必須處在同一個(gè)作用域中 ,而且函數(shù)名字相同,參數(shù)列表不同

代碼1中的Base中的 show() 和show(int) 屬于重載

代碼2中的Base中的 show() 和Derive中的show()不屬于重載不在同一個(gè)作用域下面

隱藏的關(guān)系(主要是指作用域隱藏)

在繼承結(jié)構(gòu)當(dāng)中,派生類(lèi)的同名成員,把基類(lèi)的同名成員給隱藏掉了
例如代碼2中的 Derive中的show() 和Base()中的show() ,show(int) 是隱藏關(guān)系

代碼1

class Base
{
public:
	Base(int data=10):ma(data){
	   cout<<"Base"<<endl;
        }
	void show(){cout<<"Base Show()"<<endl;}
	void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
	public:
	Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive"<<endl;
	}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){

     Derive d(20); 
     d.show(); //正常調(diào)用基類(lèi)show()
     d.show(100); //正常調(diào)用基類(lèi)show(int)
     return 0;

}

代碼2

class Base
{
public:
        Base(int data=10):ma(data){
	   cout<<"Base"<<endl;
        }
	void show(){cout<<"Base Show()"<<endl;}
	void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
	public:
	   Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive"<<endl;
	   }
	void show(){cout<<"Derive Show()"<<endl;}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){

     Derive d(20);
     d.show();   //調(diào)用子類(lèi)show()
     d.show(100);//調(diào)用報(bào)錯(cuò) 報(bào)錯(cuò)信息 "Derive::show()函數(shù)不接受1個(gè)參數(shù)"
     // 即 Derive中的show()方法把Base中的show()和show(int)都給隱藏掉了
     // 所以d.show()沒(méi)問(wèn)題,調(diào)用的是派生類(lèi)的show(),但是d.show(100)報(bào)錯(cuò)了,因?yàn)?
     // 父類(lèi)的show()和show(int)都被隱藏了,而派生類(lèi)Derive中沒(méi)有 show(int)方法所以報(bào)錯(cuò)了
     // 如果想調(diào)用父類(lèi)的show(int) 要這樣寫(xiě) d.Base.show(100);
     return 0;

}

基類(lèi)對(duì)象 -> 派生類(lèi)對(duì)象

類(lèi)型由上向下轉(zhuǎn) NOT OK

Base b(10);
Derive d(20);
d=b;// NOT OK

派生類(lèi)對(duì)象 ->基類(lèi)對(duì)象

類(lèi)型由下向上轉(zhuǎn) OK

Base b(10);
Derive d(20);
b=d;//OK

派生類(lèi)指針(引用) ->基類(lèi)指針 類(lèi)型由下向上轉(zhuǎn) OK

Base b(10);
Derive d(20);
Base *pb =&d;// OK 如下圖, 基類(lèi)指針只能訪問(wèn)到基類(lèi)那一部分的成員,所以是安全的

代碼3

class Base
{
public:
        Base(int data=10):ma(data){
	   cout<<"Base"<<endl;
        }
	void show(){cout<<"Base Show()"<<endl;}
	void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
     public:
	Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive"<<endl;
	}
	void show(){cout<<"Derive Show()"<<endl;}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){
Base   b(10);
Derive d(20);
Base  *pb =&d;
pb->show();    //調(diào)用的是基類(lèi)的 show 
pb->show(100);//調(diào)用的是基類(lèi)的 show(int)

((Derive *)pb)->show();    //強(qiáng)轉(zhuǎn)后 調(diào)用的是派生類(lèi)的 show 


}

基類(lèi)指針(引用) -> 派生類(lèi)對(duì)象 類(lèi)型由上向下轉(zhuǎn) NOT OK

Base b(10);
Derive d(20);
Derive *pb =&b;// NOT OK pb指針能夠訪問(wèn)的區(qū)域超過(guò)了實(shí)際對(duì)象b的內(nèi)存塊 ,危險(xiǎn)訪問(wèn)

代碼4

#include <iostream>
using namespace  std;

class Base{

public:
  Base(){
     cout<<"Base()"<<endl;
  }
  void show(){
     cout<<"Base show()"<<endl;
  }
  void show(int x){
     cout<<"Base show(int x)"<<endl;
  }
  ~Base(){
     cout<<"~Base()"<<endl;
  }

private:
     int ma;

};


class Derive :public Base{

public:
  Derive(){
     cout<<"Derive()"<<endl;
  }

  void show(){
     cout<<"Derive show()"<<endl;
  }

  ~Derive(){
     cout<<"~Derive()"<<endl;
  }

private:
     int ma;

};

int main(){

    Derive d;
    Derive *pd=&d;
    d.show();
    d.show(100);  //編譯報(bào)錯(cuò), Derive 的void show()方法把Base 的void show() void show(int x) 都隱藏了
    pd->show(100);//編譯報(bào)錯(cuò)  Derive 的void show()方法把Base 的void show() void show(int x) 都隱藏了
    return 0;
}

代碼5

#include <iostream>

using namespace  std;

class Base{

public:
  Base(){
     cout<<"Base()"<<endl;
  }

  virtual void show(){
     cout<<"Base show()"<<endl;
  }
  void show(int x){
     cout<<"Base show(int x)"<<endl;
  }
  ~Base(){
     cout<<"~Base()"<<endl;
  }

private:
     int ma;

};



class Derive :public Base{

public:
  Derive(){
     cout<<"Derive()"<<endl;
  }

  virtual void show(){
     cout<<"Derive show()"<<endl;
  }

  ~Derive(){
     cout<<"~Derive()"<<endl;
  }

private:
     int ma;

};



int main(){

    Derive *pd=new Derive();
    pd->show(100); //編譯報(bào)錯(cuò),Derive 中的show() 函數(shù),只要名字與Base中有相同名字的函數(shù)的,就會(huì)隱藏掉Base中所有的show方法(不管加不加virtual),包括void show() void show(int x)

    return 0;

}

到此這篇關(guān)于淺析C++中的重載,隱藏和覆蓋的文章就介紹到這了,更多相關(guān)C++重載 隱藏 覆蓋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中inline函數(shù)詳解

    C++中inline函數(shù)詳解

    inline函數(shù)的定義:在函數(shù)聲明或定義中函數(shù)返回類(lèi)型前加上關(guān)鍵字inline,即可以把函數(shù)指定為內(nèi)聯(lián)函數(shù)。inline函數(shù)對(duì)編譯器而言必須是可見(jiàn)的,以便它能夠在調(diào)用點(diǎn)展開(kāi)該函數(shù)。
    2015-07-07
  • 深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法

    深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法

    這篇文章主要介紹了深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • 一些語(yǔ)言的按行讀取文件的代碼實(shí)現(xiàn)小結(jié)

    一些語(yǔ)言的按行讀取文件的代碼實(shí)現(xiàn)小結(jié)

    這篇文章主要介紹了一些語(yǔ)言的按行讀取文件的代碼實(shí)現(xiàn)小結(jié),這里羅列了Java和C語(yǔ)言和C++以及PHP的實(shí)現(xiàn)需要的朋友可以參考下
    2015-08-08
  • operator new在C++中的各種寫(xiě)法總結(jié)

    operator new在C++中的各種寫(xiě)法總結(jié)

    這篇文章并不是一個(gè)綜合的手冊(cè),而是一個(gè)C++中各種內(nèi)存分配方法的概述。它面向已經(jīng)很熟悉C++語(yǔ)言的讀者
    2013-09-09
  • C++中對(duì)象與類(lèi)的詳解及其作用介紹

    C++中對(duì)象與類(lèi)的詳解及其作用介紹

    這篇文章主要介紹了C++中對(duì)象與類(lèi)的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問(wèn)題

    C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了std::queue中遇到釋放內(nèi)存錯(cuò)誤的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • QString和char以及string之間的賦值詳解

    QString和char以及string之間的賦值詳解

    QString 、string 、char* 之間免不了相互賦值。下面是自己的總結(jié)。需要的朋友可以過(guò)來(lái)參考下
    2013-10-10
  • C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的示例代碼

    猜數(shù)字小游戲是我們小時(shí)候喜歡我們一個(gè)經(jīng)典小游戲。本文將用C語(yǔ)言實(shí)現(xiàn)這一經(jīng)典游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • 一篇文章教你在C++中操作符可分為哪幾種類(lèi)和用法

    一篇文章教你在C++中操作符可分為哪幾種類(lèi)和用法

    這篇文章主要介紹了C++編程中操作符的種類(lèi)和用法,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • C語(yǔ)言 完整游戲項(xiàng)目坦克大戰(zhàn)詳細(xì)代碼

    C語(yǔ)言 完整游戲項(xiàng)目坦克大戰(zhàn)詳細(xì)代碼

    《坦克大戰(zhàn)》以二戰(zhàn)坦克為題材,既保留了射擊類(lèi)游戲的操作性,也改進(jìn)了射擊類(lèi)游戲太過(guò)于復(fù)雜難玩的高門(mén)檻特點(diǎn),集休閑與競(jìng)技于一身。經(jīng)典再度襲來(lái),流暢的畫(huà)面,瘋狂的戰(zhàn)斗,讓玩家再次進(jìn)入瘋狂坦克的世界。玩家的目標(biāo)是控制坦克躲避危險(xiǎn),消滅掉所有的敵人即可進(jìn)入下一關(guān)
    2021-11-11

最新評(píng)論