激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - C/C++ - C++繼承之同名覆蓋,函數重寫與多態詳解

C++繼承之同名覆蓋,函數重寫與多態詳解

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

這篇文章主要介紹了C++繼承之同名覆蓋,函數重寫與多態,是C++面向對象程序設計非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來幫助

如果父類成員和子類成員名字相同是否允許?會發生什么?

同名覆蓋

?
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;
    //驗證兩個int剛好是8字節,說明d對象有兩個整型數
    cout<<sizeof(d)<<endl;
    return 0;
}

運行結果

base data: 1
derived data: 2
8

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

那么如果是函數同名呢?

函數重寫

函數重寫是同名覆蓋的一種特殊情況,即子類中重新實現父類中的同名函數,屬于同名覆蓋

?
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();//父類函數被隱藏
    d.print();
    return 0;
}

運行結果

Base class
Derived class

如果調用how_to_print函數,期望傳入父類對象時調用父類打印函數,傳入子類對象時調用子類對象函數

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

結果卻是都打印Base class

Base class
Base class

結果沒有符合預期,分析:

1.傳入父類對象b的地址時,父類指針指向父類對象,打印正常;

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

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

  • 父類對象,調用父類函數
  • 子類對象,調用重寫函數

實際上以上行為就是多態

多態

所謂多態,即同樣的調用語句,在實際運行時存在不同的表現狀態,依據則是對象的類型不同

要實現上文中函數重寫的多態,需要引入virtual關鍵字,C++原生支持多態

  • 通過使用virtual關鍵字對多態進行支持
  • 被virtual聲明的函數被重寫后具有多態特性
  • 被virtual聲明的函數叫做虛函數

在父類函數print聲明前添加virtual關鍵字,print函數成為虛函數,子類重寫的函數也將自動變成虛函數,這樣就可以實現多態

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

運行結果

Base class
Derived class

多態的意義:

在程序運行過程中展現出動態的特性函數重寫必須多態實現,否則沒有意義多態是面向對象組件化程序設計的基礎特性

總結

同名覆蓋是繼承時發生在父類和子類之間,子類同名成員覆蓋(屏蔽)父類同名成員的現象;函數重寫也是同名覆蓋,函數重寫多態實現才有意義,C++通過virtual支持多態多態是面向對象組件化程序設計的基礎特性

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

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
514
主站蜘蛛池模板: 欧美精品18| 伊人一二三四区 | 欧美国产永久免费看片 | 欧美人成在线视频 | 在线播放91| 爱看久久 | wwwxxx视频 | h色在线观看 | 一级做a爱片毛片免费 | 毛片在线免费播放 | 多人乱大交xxxxx变态 | 成人午夜在线免费观看 | 黑人日比 | 日韩一级片一区二区三区 | 91在线视频在线观看 | 成人黄色网址 | 日韩.www| 色妞色视频一区二区三区四区 | 中文字幕欧美日韩 | 亚洲少妇诱惑 | 在线免费观看麻豆 | 国产精品视频久久久 | 日本xxxx色视频在线观看免费, | 一区二区三区欧洲 | 精品影视一区二区 | 国产老师做www爽爽爽视频 | 亚洲精中文字幕二区三区 | 国产一区二区三区影视 | 久久成人免费观看 | 亚洲视频欧美 | 久久伊人国产精品 | 精品一区二区视频在线观看 | 成人久久免费 | 欧美性生活区 | 日本黄色a视频 | 日韩精品免费一区二区三区 | 97香蕉超级碰碰久久免费软件 | 精品一区二区三区免费 | 中文日产幕无线码6区免费版 | 午夜影院日韩 | 激情网站在线观看 |