国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - C/C++ - C++ 虛函數及虛函數表詳解

C++ 虛函數及虛函數表詳解

2022-02-19 16:18dwell548560 C/C++

這篇文章主要介紹了c++ 虛函數及虛函數表詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

多態”的關鍵在于通過基類指針或引用調用一個虛函數時,編譯時不確定到底調用的是基類還是派生類的函數,運行時才確定。

#include <iostream>
using namespace std;
class A
{
public:
  int i;
  virtual void func() {}
  virtual void func2() {}
};
class B : public A
{
  int j;
  void func() {}
};
int main()
{
  cout << sizeof(A) << ", " << sizeof(B);  //輸出 8,12
  return 0;
}

在 32 位編譯模式下,程序的運行結果是:

8, 12

如果將程序中的 virtual 關鍵字去掉,輸出結果變為:

4, 8

A * p = new B() 實現多態

對比發現,有了虛函數以后,對象所占用的存儲空間比沒有虛函數時多了 4 個字節。實際上,任何有虛函數的類及其派生類的對象都包含這多出來的 4 個字節,這 4 個字節就是實現多態的關鍵――它位于對象存儲空間的最前端,其中存放的是虛函數表的地址。

每一個有虛函數的類(或有虛函數的類的派生類)都有一個虛函數表,該類的任何對象中都放著該虛函數表的指針(可以認為這是由編譯器自動添加到構造函數中的指令完成的)。

沒有覆蓋時的子類,可以看到子類的虛函數表的前面是基類離得虛函數

C++ 虛函數及虛函數表詳解

有覆蓋就是

C++ 虛函數及虛函數表詳解

子類對象地址為什么能賦值給父類對象指針?

因為,子類對象地址賦值給父類對象指針,父類對象指針就指向了子類的對象空間,父類操作子類的范圍是有限制的,只能操作到子類中父類的范圍。

基類和子類各有自己的虛函數表vtbl;不管是基類還是子類實例都會在其內存的開頭自動創對象即虛函數表指針vptr, 用來訪問所在類的虛函數表

想要實現多態,需要動態綁定,需要父類的指針或父類的引用

父類方法為虛方法,子類覆蓋父類的虛方法,才能達到多態

子類中父類沒有的方法,父類指針也無法訪問到,父類指針只能訪問到父類自己有的范圍

子類要覆蓋父類的方法,就是要函數名參數都必須一樣才叫覆蓋

C++ 虛函數及虛函數表詳解

C++ 虛函數及虛函數表詳解

再看一個例子

class A {
public:
  virtual void vfunc1();
  virtual void vfunc2();
  void func1();
  void func2();
private:
  int m_data1, m_data2;
};
class B : public A {
public:
  virtual void vfunc1();
  void func1();
private:
  int m_data3;
};
class C: public B {
public:
  virtual void vfunc2();
  void func2();
private:
  int m_data1, m_data4;
};

C++ 虛函數及虛函數表詳解

子類繼承父類,子類中有父類的同名方法,訪問的是子類的方法,子類會隱藏父類所有的同名方法,即使父類有一個同名的參數不同的方法也是如此。

多重繼承(無虛函數覆蓋)

下面,再讓我們來看看多重繼承中的情況,假設有下面這樣一個類的繼承關系。注意:子類并沒有覆蓋父類的函數。

C++ 虛函數及虛函數表詳解

對于子類實例中的虛函數表,是下面這個樣子:

C++ 虛函數及虛函數表詳解

我們可以看到:

1) 每個父類都有自己的虛表。

2) 子類的成員函數被放到了第一個父類的表中。(所謂的第一個父類是按照聲明順序來判斷的)

這樣做就是為了解決不同的父類類型的指針指向同一個子類實例,而能夠調用到實際的函數。

多重繼承(有虛函數覆蓋)

下面我們再來看看,如果發生虛函數覆蓋的情況。

下圖中,我們在子類中覆蓋了父類的f()函數。

C++ 虛函數及虛函數表詳解

下面是對于子類實例中的虛函數表的圖:

C++ 虛函數及虛函數表詳解

我們可以看見,三個父類虛函數表中的f()的位置被替換成了子類的函數指針。這樣,我們就可以任一靜態類型的父類來指向子類,并調用子類的f()了。

任何妄圖使用父類指針想調用子類中的未覆蓋父類的成員函數的行為都會被編譯器視為非法,

 

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/dwell548560/article/details/121031625

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

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

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

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

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

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

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

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

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

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

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

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

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

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

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

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

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

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

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

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

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

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

    C語言實現電腦關機程序

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

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 激情欧美一区二区三区中文字幕 | 成人在线免费 | 性高湖久久久久久久久aaaaa | 国产精品无码永久免费888 | 九九亚洲| 亚洲一区久久 | 亚洲国产成人精品女人久久久 | 成人一区二区三区久久精品嫩草 | 国产精品欧美一区二区三区不卡 | 亚洲国产精品激情在线观看 | 久久国产一区二区 | 久久性网站 | 日韩在线播 | 亚洲 成人 一区 | 国产精品久久电影观看 | 欧美日韩一区精品 | 成人午夜毛片 | 黄色片网址在线观看 | 精品成人一区 | 日本视频网 | 亚洲人成网站b2k3cm | 国产91在线观看 | 在线播放国产一区二区三区 | 久久aⅴ国产欧美74aaa | 久久精品中文字幕一区二区 | 在线看91 | 午夜免费福利视频 | 国产精品中文字幕在线观看 | 丝袜天堂 | 中国妞xxx | 青青草草 | 午夜日韩| 天天干,夜夜操 | 一本久久a久久精品亚洲 | 毛片在线免费观看网站 | 免费成人在线视频观看 | 国产精品免费在线 | 亚洲国产婷婷香蕉久久久久久99 | 国产一区av在线 | 欧美成人影院 | 最近高清无吗免费看 |