一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C/C++ - C++繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

C++繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

2022-01-17 15:13ryan-wei C/C++

這篇文章主要介紹了C++繼承之同名覆蓋,函數(shù)重寫與多態(tài),是C++面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來幫助

如果父類成員和子類成員名字相同是否允許?會(huì)發(fā)生什么?

同名覆蓋

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
using namespace std;
class Base
{
public:
    int m_data;
    Base():m_data(1)//父類初始化為1
    {  }
};
class Derived : public Base
{
public:
    int m_data;
    Derived():m_data(2)//子類初始化為2
    {  }
};
int main()
{
    Derived d;
    //父類的m_data被隱藏了,但仍存在,可以通過::符訪問
    cout<<"base data: "<<d.Base::m_data<<endl;
    //直接訪問m_data得到的是子類成員的值
    cout<<"derived data: "<<d.m_data<<endl;
    //驗(yàn)證兩個(gè)int剛好是8字節(jié),說明d對(duì)象有兩個(gè)整型數(shù)
    cout<<sizeof(d)<<endl;
    return 0;
}

運(yùn)行結(jié)果

base data: 1
derived data: 2
8

說明父類和子類是允許存在同名成員的,只不過父類的成員被編譯器隱藏了,正常訪問得到的是子類成員的值。

那么如果是函數(shù)同名呢?

函數(shù)重寫

函數(shù)重寫是同名覆蓋的一種特殊情況,即子類中重新實(shí)現(xiàn)父類中的同名函數(shù),屬于同名覆蓋

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
class Base
{
public:
    void print()
    {
        cout<<"Base class"<<endl;
    }
};
class Derived : public Base
{
public:
    void print()
    {
        cout<<"Derived class"<<endl;
    }
};
int main()
{
    Derived d;
    d.Base::print();//父類函數(shù)被隱藏
    d.print();
    return 0;
}

運(yùn)行結(jié)果

Base class
Derived class

如果調(diào)用how_to_print函數(shù),期望傳入父類對(duì)象時(shí)調(diào)用父類打印函數(shù),傳入子類對(duì)象時(shí)調(diào)用子類對(duì)象函數(shù)

?
1
2
3
4
5
6
7
8
9
10
11
12
void how_to_print(Base* p)
{
    p->print();//期望根據(jù)對(duì)象選擇相應(yīng)函數(shù),不能實(shí)現(xiàn)
}
int main()
{
    Base b;
    Derived d;
    how_to_print(&b);
    how_to_print(&d);
    return 0;
}

結(jié)果卻是都打印Base class

Base class
Base class

結(jié)果沒有符合預(yù)期,分析:

1.傳入父類對(duì)象b的地址時(shí),父類指針指向父類對(duì)象,打印正常;

2.傳入子類對(duì)象d的地址時(shí),父類指針指向子類對(duì)象,此時(shí)由于賦值兼容性(子類對(duì)象可以當(dāng)作父類對(duì)象使用),子類對(duì)象退化為父類對(duì)象(父類指針只能訪問父類成員),編譯器認(rèn)為父類指針指向的是父類對(duì)象,因此最終調(diào)用了父類的打印函數(shù)

以上結(jié)果是合理的,卻沒有符合預(yù)期的目的,這也是函數(shù)重寫帶來的問題。如果不能實(shí)現(xiàn)以上目的,函數(shù)重寫是沒有意義的,那么如何實(shí)現(xiàn)父類指針(引用)指向:

  • 父類對(duì)象,調(diào)用父類函數(shù)
  • 子類對(duì)象,調(diào)用重寫函數(shù)

實(shí)際上以上行為就是多態(tài)

多態(tài)

所謂多態(tài),即同樣的調(diào)用語(yǔ)句,在實(shí)際運(yùn)行時(shí)存在不同的表現(xiàn)狀態(tài),依據(jù)則是對(duì)象的類型不同

要實(shí)現(xiàn)上文中函數(shù)重寫的多態(tài),需要引入virtual關(guān)鍵字,C++原生支持多態(tài)

  • 通過使用virtual關(guān)鍵字對(duì)多態(tài)進(jìn)行支持
  • 被virtual聲明的函數(shù)被重寫后具有多態(tài)特性
  • 被virtual聲明的函數(shù)叫做虛函數(shù)

在父類函數(shù)print聲明前添加virtual關(guān)鍵字,print函數(shù)成為虛函數(shù),子類重寫的函數(shù)也將自動(dòng)變成虛函數(shù),這樣就可以實(shí)現(xiàn)多態(tài)

?
1
2
3
4
5
6
7
8
class Base
{
public:
    virtual void print()//加virtual變成了虛函數(shù)
    {
        cout<<"Base class"<<endl;
    }
};

運(yùn)行結(jié)果

Base class
Derived class

多態(tài)的意義:

在程序運(yùn)行過程中展現(xiàn)出動(dòng)態(tài)的特性函數(shù)重寫必須多態(tài)實(shí)現(xiàn),否則沒有意義多態(tài)是面向?qū)ο蠼M件化程序設(shè)計(jì)的基礎(chǔ)特性

總結(jié)

同名覆蓋是繼承時(shí)發(fā)生在父類和子類之間,子類同名成員覆蓋(屏蔽)父類同名成員的現(xiàn)象;函數(shù)重寫也是同名覆蓋,函數(shù)重寫多態(tài)實(shí)現(xiàn)才有意義,C++通過virtual支持多態(tài)多態(tài)是面向?qū)ο蠼M件化程序設(shè)計(jì)的基礎(chǔ)特性

原文鏈接:https://blog.csdn.net/to_free/article/details/120538227

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草影院在线观看 | 国产成人福利免费观看 | 70岁多老妇人特黄a级毛片 | 欧美日韩专区国产精品 | 奇米7777第四色 | 无码欧美喷潮福利XXXX | 毛片视频网站在线观看 | 国产尤物视频 | 欧美视频网址 | 久久毛片视频 | chinesexxxxhd人妖| 91免费永久在线地址 | 91精品手机国产在线观 | 免费激情小视频 | 免费观看韩剧网站在线观看 | 国产巨大bbbb俄罗斯 | 911亚洲精品国内自产 | 欧美精品亚洲精品日韩专区va | 丝袜兔女郎被啪在线观看91 | 午夜爱| 香蕉91视频 | 欧美伊人影院 | 色妞视频一级毛片 | 午夜久久免影院欧洲 | 美女逼逼软件 | 菠萝视频污 | 成人夜视频寂寞在线观看 | a级毛片毛片免费很很综合 a级黄色视屏 | www.福利| 日韩精选视频 | 任我淫 | 日本高清二三四本2021 | 精品在线免费观看视频 | 99在线免费播放 | 色婷在线| 亚洲国产精品一在线观看 | 国产视频自拍一区 | 私人影院在线播放 | 亚洲无人区乱码中文字幕 | 大学生特黄特色大片免费播放 | 欧美a一片xxxx片与善交 |