日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中的覆盖(重写)、重载、隐藏(重定义)、多态!

發(fā)布時間:2025/6/15 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的覆盖(重写)、重载、隐藏(重定义)、多态! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

例一:



首先聲明Base類型的指針指向?qū)嶋H類型為Derived的對象,先調(diào)用基類構(gòu)造函數(shù),再調(diào)用派生類構(gòu)造函數(shù)。輸出Base, Derived.

base->echo(); 指針是base類型,但是因為有關(guān)鍵詞 virtual,所以不是隱藏而是重寫.調(diào)用的是Derived的方法,輸出Derived。

1.重載:重載從overload翻譯過來,是指同一可訪問區(qū)內(nèi)被聲明的幾個具有不同參數(shù)列(參數(shù)的類型,個數(shù),順序不同)的同名函數(shù),根據(jù)參數(shù)列表確定調(diào)用哪個函數(shù),重載不關(guān)心函數(shù)返回類型。
2.隱藏:隱藏是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù)。注意只要同名函數(shù),不管參數(shù)列表是否相同,基類函數(shù)都會被隱藏。
3.重寫:重寫翻譯自override,也翻譯成覆蓋(更好一點(diǎn)),是指派生類中存在重新定義的函數(shù)。其函數(shù)名,參數(shù)列表,返回值類型,所有都必須同基類中被重寫的函數(shù)一致。只有函數(shù)體不同(花括號)。


例二:



這道題目可以這么去拆分就很好理解了:
?((B *)(&c))->func() ? ==》 ? B *temp; ? temp = &c; ? ?temp->func(); ? ==》 這不就是一個典型的多態(tài)問題么,用基類指針指向派生類對象,所以肯定調(diào)用的是C對象的func函數(shù),
輸出 C test


而((B)c).func(),此代碼是先建立類B的對象c,然后調(diào)用c的成員函數(shù)func(),當(dāng)然func中的Test()是屬于類B的對象c的成員函數(shù),自然會輸出B test。


C++中的覆蓋(重寫)、重載、隱藏、多態(tài)!
1.C++多態(tài)性是通過虛函數(shù)來實(shí)現(xiàn)的,虛函數(shù)允許子類重新定義成員函數(shù),而子類重新定義父類的做法稱為覆蓋(override),或者稱為重寫。(這里我覺得要補(bǔ)充,重寫的話可以有兩種,直接重寫成員函數(shù)和重寫虛函數(shù),只有重寫了虛函數(shù)的才能算作是體現(xiàn)了C++多態(tài)性)而重載則是允許有多個同名的函數(shù),而這些函數(shù)的參數(shù)列表不同,允許參數(shù)個數(shù)不同,參數(shù)類型不同,或者兩者都不同。編譯器會根據(jù)這些函數(shù)的不同列表,將同名的函數(shù)的名稱做修飾,從而生成一些不同名稱的預(yù)處理函數(shù),來實(shí)現(xiàn)同名函數(shù)調(diào)用時的重載問題。但這并沒有體現(xiàn)多態(tài)性。

成員函數(shù)被重載的特征:

(1)相同的范圍(在同一個類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual關(guān)鍵字可有可無。?

覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual關(guān)鍵字。
(5)被重寫的函數(shù)不能是static的,必須是virtual的
? ? ? ? ?重寫函數(shù)必須有相同的類型,名稱和參數(shù)列表
? ? ? ? ?重寫函數(shù)的訪問修飾符可以不同。盡管virtual是private的,派生類中重寫改寫為public、protect也是可以的


隱藏重定義指派生類函數(shù)屏蔽了與其同名的基類函數(shù),特征是:?
(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同,不論有無virtual關(guān)鍵字,基類的函數(shù)將被隱藏。(注意不能與重載混淆)?
(2)如果派生類的函數(shù)與基類的函數(shù)同名,參數(shù)也相同,基類函數(shù)沒有virtual關(guān)鍵字,基類的函數(shù)將被隱藏。(注意不能與覆蓋混淆)

2.多態(tài)性可以簡單地概括為“一個接口,多種方法”,程序在運(yùn)行時才決定調(diào)用的函數(shù),
它是面向?qū)ο缶幊填I(lǐng)域的核心概念。多態(tài)(polymorphism),字面意思多種形狀。多態(tài)與非多態(tài)的實(shí)質(zhì)區(qū)別就是函數(shù)地址是早綁定還是晚綁定。如果函數(shù)的調(diào)用,在編譯器編譯期間就可以確定函數(shù)的調(diào)用地址,并生產(chǎn)代碼,是靜態(tài)的,就是說地址是早綁定的。而如果函數(shù)調(diào)用的地址不能在編譯器期間確定,需要在運(yùn)行時才確定,這就屬于晚綁定。
那么多態(tài)的作用是什么呢,封裝可以使得代碼模塊化,繼承可以擴(kuò)展已存在的代碼,他們的目的都是為了代碼重用。而多態(tài)的目的則是為了接口重用。也就是說,不論傳遞過來的究竟是那個類的對象,函數(shù)都能夠通過同一個接口調(diào)用到適應(yīng)各自對象的實(shí)現(xiàn)方法。
最常見的用法就是聲明基類的指針,利用該指針指向任意一個子類對象,調(diào)用相應(yīng)的虛函數(shù),可以根據(jù)指向的子類的不同而實(shí)現(xiàn)不同的方法。如果沒有使用虛函數(shù)的話,即沒有利用C++多態(tài)性,則利用基類指針調(diào)用相應(yīng)的函數(shù)的時候,將總被限制在基類函數(shù)本身,而無法調(diào)用到子類中被重寫過的函數(shù)。
因為沒有多態(tài)性,函數(shù)調(diào)用的地址將是一定的,而固定的地址將始終調(diào)用到同一個函數(shù),這就無法實(shí)現(xiàn)一個接口,多種方法的目的了。


#include<iostream> ?
using namespace std; ?
??
class A ?
{ ?
public: ?
? ? void foo() ?
? ? { ?
? ? ? ? printf("1\n"); ?
? ? } ?
? ? virtual void fun() ?
? ? { ?
? ? ? ? printf("2\n"); ?
? ? } ?
}; ?
class B : public A ?
{ ?
public: ?
? ? void foo() ?
? ? { ?
? ? ? ? printf("3\n"); ?
? ? } ?
? ? void fun() ?
? ? { ?
? ? ? ? printf("4\n"); ?
? ? } ?
}; ?
int main(void) ?
{ ?
? ? A a; ?
? ? B b; ?
? ? A *p = &a; ?
? ? p->foo(); ?
? ? p->fun(); ?
? ? p = &b; ?
? ? p->foo(); ?
? ? p->fun(); ?
? ? return 0; ?
}


第一個p->foo()和p->fuu()都很好理解,本身是基類指針,指向的又是基類對象,調(diào)用的都是基類本身的函數(shù),因此輸出結(jié)果就是1、2。
第二個輸出結(jié)果就是1、4。p->foo()和p->fuu()則是基類指針指向子類對象,正式體現(xiàn)多態(tài)的用法,p->foo()由于指針是個基類指針,指向是一個固定偏移量的函數(shù),因此此時指向的就只能是基類的foo()函數(shù)的代碼了,因此輸出的結(jié)果還是1。而p->fun()指針是基類指針,指向的fun是一個虛函數(shù),由于每個虛函數(shù)都有一個虛函數(shù)列表,此時p調(diào)用fun()并不是直接調(diào)用函數(shù),而是通過虛函數(shù)列表找到相應(yīng)的函數(shù)的地址,因此根據(jù)指向的對象不同,函數(shù)地址也將不同,這里將找到對應(yīng)的子類的fun()函數(shù)的地址,因此輸出的結(jié)果也會是子類的結(jié)果4。
筆試的題目中還有一個另類測試方法。即
B *ptr = (B *)&a; ?ptr->foo(); ?ptr->fun();
問這兩調(diào)用的輸出結(jié)果。這是一個用子類的指針去指向一個強(qiáng)制轉(zhuǎn)換為子類地址的基類對象。結(jié)果,這兩句調(diào)用的輸出結(jié)果是3,2。
并不是很理解這種用法,從原理上來解釋,由于B是子類指針,雖然被賦予了基類對象地址,但是ptr->foo()在調(diào)用的時候,由于地址偏移量固定,偏移量是子類對象的偏移量,于是即使在指向了一個基類對象的情況下,還是調(diào)用到了子類的函數(shù),雖然可能從始到終都沒有子類對象的實(shí)例化出現(xiàn)。
而ptr->fun()的調(diào)用,可能還是因為C++多態(tài)性的原因,由于指向的是一個基類對象,通過虛函數(shù)列表的引用,找到了基類中fun()函數(shù)的地址,因此調(diào)用了基類的函數(shù)。由此可見多態(tài)性的強(qiáng)大,可以適應(yīng)各種變化,不論指針是基類的還是子類的,都能找到正確的實(shí)現(xiàn)方法。


//小結(jié):1、有virtual才可能發(fā)生多態(tài)現(xiàn)象
// 2、不發(fā)生多態(tài)(無virtual)調(diào)用就按原類型調(diào)用
#include<iostream>
using namespace std;


class Base
{
public:
virtual void f(float x)
{
cout<<"Base::f(float)"<< x <<endl;
}
void g(float x)
{
cout<<"Base::g(float)"<< x <<endl;
}
void h(float x)
{
cout<<"Base::h(float)"<< x <<endl;
}
};
class Derived : public Base
{
public:
virtual void f(float x)
{
cout<<"Derived::f(float)"<< x <<endl; ? //多態(tài)、覆蓋
}
void g(int x)
{
cout<<"Derived::g(int)"<< x <<endl; ? ? //隱藏
}
void h(float x)
{
cout<<"Derived::h(float)"<< x <<endl; ? //隱藏
}
};
int main(void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;
// Good : behavior depends solely on type of the object
pb->f(3.14f); ? // Derived::f(float) 3.14
pd->f(3.14f); ? // Derived::f(float) 3.14


// Bad : behavior depends on type of the pointer
pb->g(3.14f); ? // Base::g(float) ?3.14
pd->g(3.14f); ? // Derived::g(int) 3?


// Bad : behavior depends on type of the pointer
pb->h(3.14f); ? // Base::h(float) 3.14
pd->h(3.14f); ? // Derived::h(float) 3.14
return 0;
}


令人迷惑的隱藏規(guī)則
本來僅僅區(qū)別重載與覆蓋并不算困難,但是C++的隱藏規(guī)則使問題復(fù)雜性陡然增加。
這里“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下:
(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時,不論有無virtual
關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual
關(guān)鍵字。此時,基類的函數(shù)被隱藏(注意別與覆蓋混淆)。
上面的程序中:
(1)函數(shù)Derived::f(float)覆蓋了Base::f(float)。
(2)函數(shù)Derived::g(int)隱藏了Base::g(float),而不是重載。
(3)函數(shù)Derived::h(float)隱藏了Base::h(float),而不是覆蓋。


C++純虛函數(shù)
?一、定義
? 純虛函數(shù)是在基類中聲明的虛函數(shù),它在基類中沒有定義,但要求任何派生類都要定義自己的實(shí)現(xiàn)方法。在基類中實(shí)現(xiàn)純虛函數(shù)的方法是在函數(shù)原型后加“=0”?
? virtual void funtion()=0?
二、引入原因
? ?1、為了方便使用多態(tài)特性,我們常常需要在基類中定義虛擬函數(shù)。?
? ?2、在很多情況下,基類本身生成對象是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成對象明顯不合常理。?
? 為了解決上述問題,引入了純虛函數(shù)的概念,將函數(shù)定義為純虛函數(shù)(方法:virtual ReturnType Function()= 0;),則編譯器要求在派生類中必須予以重寫以實(shí)現(xiàn)多態(tài)性。同時含有純虛擬函數(shù)的類稱為抽象類,它不能生成對象。這樣就很好地解決了上述兩個問題。
三、相似概念
? ?1、多態(tài)性?
? 指相同對象收到不同消息或不同對象收到相同消息時產(chǎn)生不同的實(shí)現(xiàn)動作。C++支持兩種多態(tài)性:編譯時多態(tài)性,運(yùn)行時多態(tài)性。?
? a、編譯時多態(tài)性:通過重載函數(shù)實(shí)現(xiàn)?
? b、運(yùn)行時多態(tài)性:通過虛函數(shù)實(shí)現(xiàn)。?
? 2、虛函數(shù)?
? 虛函數(shù)是在基類中被聲明為virtual,并在派生類中重新定義的成員函數(shù),可實(shí)現(xiàn)成員函數(shù)的動態(tài)覆蓋(Override)
? 3、抽象類?
? 包含純虛函數(shù)的類稱為抽象類。由于抽象類包含了沒有定義的純虛函數(shù),所以不能定義抽象類的對象。







總結(jié)

以上是生活随笔為你收集整理的C++中的覆盖(重写)、重载、隐藏(重定义)、多态!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 九九视频精品在线 | 一级黄色美女 | 欧美在线一区二区三区 | 亚洲国产色图 | 中文字幕一区二区三区在线视频 | 精品一级少妇久久久久久久 | 亚洲乱码一区二区 | 亚洲视频1区 | 日韩一区在线观看视频 | 日本精品入口免费视频 | 夜夜夜夜夜操 | www.美色吧.com| 色日本在线| 欧美三级 欧美一级 | 久久久久亚洲av成人毛片韩 | av日韩不卡 | 欧美性猛交xxxx乱大交hd | 荷兰女人裸体性做爰 | 国产人妻互换一区二区 | 一区二区视频在线播放 | 一区二区三区免费看视频 | 五月丁香久久婷婷 | 中文字幕人妻一区二区三区视频 | 亚洲丁香婷婷 | 91精品又粗又猛又爽 | 蜜臀av无码一区二区三区 | 少妇人妻互换不带套 | 久9精品| 超碰1997 | 牲欲强的熟妇农村老妇女视频 | 欧美极品在线观看 | 欧美性猛交xxxx免费看久久久 | 亚洲97在线 | 午夜久久久久久久久 | 精品福利在线 | 日韩一区免费 | 欧美日韩在线免费视频 | 国产女18毛片多18精品 | av中出在线 | 精品人妻码一区二区三区红楼视频 | 美女试爆场恐怖电影在线观看 | 毛片久久久久久久 | 色悠悠国产 | 婷婷成人在线 | 麻豆免费在线 | 国产三级观看 | 青青草综合网 | 波多野结衣在线观看视频 | 国产精品一区二区无码对白 | 1级黄色大片儿 | aa视频网站 | 97av视频| 热久久精 | 28一20岁女人一级 | 粉嫩精品久久99综合一区 | 91情侣在线| 国产精品无码一区二区桃花视频 | 国产三级国产精品国产专区50 | 96亚洲精品久久久蜜桃 | 欧美日韩在线播放视频 | av自拍偷拍 | av黄在线观看 | 韩国三级中文字幕hd久久精品 | 99草| 国产欧美在线播放 | 亚洲一区二区美女 | 日韩二区三区 | 国产伦精品一区二区三区精品 | 国产女女调教女同 | 亚洲婷婷在线观看 | 又大又长粗又爽又黄少妇视频 | 伦理片久久| 国产在线播放一区二区三区 | 日本波多野结衣在线 | 天天射av | 91精品国产色综合久久不卡粉嫩 | 91爱| 激情视频在线观看免费 | 美国av毛片 | 美国一级大黄一片免费中文 | 国产精品美乳在线观看 | 日韩精品在线免费观看 | 激情小视频在线观看 | 国产叼嘿视频在线观看 | 亚洲午夜久久久久久久久久久 | 本站只有精品 | 成人午夜大片 | 在线看黄免费 | 中文字幕国产日韩 | 国产伊人久久 | 天堂视频在线免费观看 | 亚洲视频在线免费播放 | 亚洲精品污一区二区三区 | 亚洲激情成人网 | 中文字幕av影院 | 免费一区二区 | 国产激情免费视频 | 美女张开腿让男人操 | 青青青网 |