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

c++虛函數(shù)與虛函數(shù)表原理

 更新時(shí)間:2022年01月24日 16:57:26   作者:考拉愛(ài)睡覺(jué)鴨~  
這篇文章主要介紹了c++虛函數(shù)與虛函數(shù)表原理,用virtual?修飾的成員函數(shù)叫虛函數(shù),下面圍繞c++虛函數(shù)與虛函數(shù)得相關(guān)資料展開(kāi)內(nèi)容,需要的朋友可以參考一下

1.什么是虛函數(shù)?

virtual 修飾的成員函數(shù)叫虛函數(shù)

小知識(shí): 沒(méi)有虛構(gòu)造函數(shù)        不寫虛函數(shù),沒(méi)有默認(rèn)的虛函數(shù)

普通函數(shù)不影響類的內(nèi)存:

class MM
{
public:
    void print() 
 {
  cout << "普通函數(shù)"<< endl;    //普通函數(shù)不影響類的內(nèi)存<--->普通函數(shù)存在另一段內(nèi)存中
 }
protected:
};

void testVirtual()
{
 //C語(yǔ)言不允許存在空的結(jié)構(gòu)體
 cout << sizeof(MM) << endl;/*(沒(méi)有數(shù)據(jù)成員的)空的類或者結(jié)構(gòu)體 占用1字節(jié)  用1字節(jié)標(biāo)識(shí)當(dāng) 
                                   前內(nèi)存為結(jié)構(gòu)體內(nèi)存*/
}
int main() 
{
 testVirtual();
 return 0;
}
/*輸出*/

/* 1 */

2.虛函數(shù)會(huì)影響類的內(nèi)存

增加一個(gè)指針的內(nèi)存,32位操作系統(tǒng)多4個(gè)字節(jié) ,64位操作系統(tǒng)多8個(gè)字節(jié)

#include <iostream>
using namespace std;
class MM
{
public:
 virtual void print1() 
 {
  cout << "虛函數(shù)1"<< endl;
 }
 /*virtual void print2()
 {
  cout << "虛函數(shù)2" << endl;
 }     無(wú)論多少個(gè)虛函數(shù),增加的字節(jié)就是一個(gè)指針的字節(jié)--->多了一個(gè)虛函數(shù),還是4個(gè)字節(jié)*/
protected:
};
void testVirtual()
{
 
 cout << sizeof(MM) << endl;  
 
}
int main() 
{
 testVirtual();
 return 0;
}
/*輸出*/

/*  4  */

小知識(shí):一旦有了數(shù)據(jù),標(biāo)識(shí)位就不需要存在了

class A
{
 int num;    //輸出4而不是5   (4+1)
};
class B
{
    //用1字節(jié)標(biāo)識(shí)當(dāng)前內(nèi)存為結(jié)構(gòu)體內(nèi)存
};
void testVirtual()
{

 cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
}
int main()
{
 testVirtual();
 return 0;
}

/*輸出*/

/*4
  1*/

3.了解虛函數(shù)表--->通過(guò)虛函數(shù)表的指針去訪問(wèn)數(shù)據(jù)

就是一個(gè)指針存儲(chǔ)所有虛函數(shù)的首地址(虛函數(shù)函數(shù)名)<--->函數(shù)指針

只有指針可以操作一段內(nèi)存(4字節(jié))

/*無(wú)論多少個(gè)虛函數(shù),增加的字節(jié)就是一個(gè)指針的字節(jié)*/
所有的虛函數(shù)其實(shí)是 用一個(gè)函數(shù)指針去存儲(chǔ)的 ,把 這個(gè)函數(shù)指針指向的這一段內(nèi)存 稱為虛函數(shù)表

#include <iostream>
using namespace std;
class MM
{
public:
 virtual void print1() 
 {
  cout << "虛函數(shù)1"<< endl;
 } 
    virtual void print2() 
 {
  cout << "虛函數(shù)2"<< endl;
 } 
protected:
};
void testVirtual()
{
//虛函數(shù)表  
 MM mm;    //構(gòu)建一個(gè)對(duì)象
 int** vptr = (int** )&mm;    //定義一個(gè)二級(jí)指針&對(duì)象的地址  強(qiáng)轉(zhuǎn)類型
 typedef void(*PF)();         //函數(shù)指針定義別名
 PF func = (PF)vptr[0][0];    //把地址轉(zhuǎn)為函數(shù)指針,訪問(wèn)第一個(gè)函數(shù)指針的地址

 func();  //通過(guò)虛函數(shù)表的函數(shù)指針調(diào)用第一個(gè)虛函數(shù)
 func = (PF)vptr[0][1];
 func();  //調(diào)用第二個(gè)虛函數(shù)
}
int main() 
{
 testVirtual();
 return 0;
}
/*輸出*/

/*虛函數(shù)1
  虛函數(shù)2*/

4.虛函數(shù)聲明

虛函數(shù)可以在類中聲明,在類外實(shí)現(xiàn),不再需要virtual修飾詞,只要類名限定就可以了

class MM
{
public:
 virtual void print3();
  
protected:
};
void MM::print3() {
 cout << "虛函數(shù)3" << endl;

}
int main()
{
 MM mm;
 mm.print3();
 return 0;
}
/*輸出*/

/*虛函數(shù)3*/

到此這篇關(guān)于c++虛函數(shù)與虛函數(shù)表原理的文章就介紹到這了,更多相關(guān)c++虛函數(shù)與虛函數(shù)表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)采集

    Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)采集

    這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)采集的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)完整版

    C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)完整版

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生選課系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 一起來(lái)學(xué)習(xí)C語(yǔ)言的程序環(huán)境與預(yù)處理

    一起來(lái)學(xué)習(xí)C語(yǔ)言的程序環(huán)境與預(yù)處理

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言程序環(huán)境與預(yù)處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C++ 操作系統(tǒng)內(nèi)存分配算法的實(shí)現(xiàn)詳解

    C++ 操作系統(tǒng)內(nèi)存分配算法的實(shí)現(xiàn)詳解

    本文主要介紹了在動(dòng)態(tài)分區(qū)管理方式下采用不同的分配算法實(shí)現(xiàn)主存分配和實(shí)現(xiàn)主存回收,旨在幫助學(xué)生理解在動(dòng)態(tài)分區(qū)管理方式下應(yīng)怎樣實(shí)現(xiàn)主存空間的分配和回收。感興趣的可以了解一下
    2021-11-11
  • C語(yǔ)言中的柔性數(shù)組你真的了解嗎

    C語(yǔ)言中的柔性數(shù)組你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中的柔性數(shù)組你,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Qt5.9程序打包發(fā)布的實(shí)現(xiàn)

    Qt5.9程序打包發(fā)布的實(shí)現(xiàn)

    本文主要介紹了Qt5.9程序打包發(fā)布的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 7種排序算法的實(shí)現(xiàn)示例

    7種排序算法的實(shí)現(xiàn)示例

    這篇文章主要介紹了7種排序算法的實(shí)現(xiàn)示例,需要的朋友可以參考下
    2014-05-05
  • C++超詳細(xì)探究new/delete的使用

    C++超詳細(xì)探究new/delete的使用

    這篇文章主要介紹了C++中new與deleted關(guān)鍵字的使用,new在動(dòng)態(tài)內(nèi)存中為對(duì)象分配空間并返回一個(gè)指向該對(duì)象的指針;delete接受一個(gè)動(dòng)態(tài)對(duì)象的指針, 銷毀該對(duì)象, 并釋放與之關(guān)聯(lián)的內(nèi)存
    2022-07-07
  • C++私有繼承(一)

    C++私有繼承(一)

    這篇文章主要介紹了C++私有繼承,在私有繼承當(dāng)中,基類的公有成員和保護(hù)成員都會(huì)成為派生類的私有成員。這意味著基類的方法都會(huì)被private關(guān)鍵字描述,我們可以在派生類中使用它,但類對(duì)象無(wú)法直接調(diào)用,下面來(lái)看看詳細(xì)內(nèi)容吧
    2022-01-01
  • C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論