最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)

 更新時(shí)間:2023年08月02日 09:09:04   作者:lk_HIT  
這篇文章主要介紹了C++如何在構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C++構(gòu)造函數(shù)和析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)

C++構(gòu)造器可以為虛擬函數(shù)嗎?

不行。

因?yàn)闃?gòu)造器調(diào)用的時(shí)候會(huì)設(shè)置當(dāng)前類(lèi)的虛表地址,然后如果構(gòu)造函數(shù)本身為虛擬函數(shù),那么調(diào)用構(gòu)造函數(shù)就需要提前訪問(wèn)虛表,此時(shí)虛表指針還沒(méi)有指向虛表,就沒(méi)法訪問(wèn)虛表。

構(gòu)造函數(shù)中可以調(diào)用虛擬函數(shù)嗎?

可以。

但是調(diào)用虛擬函數(shù)就是調(diào)用跟調(diào)用普通函數(shù)效果一樣。

因?yàn)樽宇?lèi)在創(chuàng)建的時(shí)候是先調(diào)用父類(lèi)的構(gòu)造器,父類(lèi)的構(gòu)造器先設(shè)置好父類(lèi)的虛表地址,然后再執(zhí)行構(gòu)造器中的代碼,然后在回到子類(lèi)構(gòu)造器,先將虛表地址替換為子類(lèi)的虛表地址,然后執(zhí)行子類(lèi)構(gòu)造器的代碼。

因此如果在父類(lèi)構(gòu)造器中調(diào)用虛函數(shù),那么此時(shí)是從父類(lèi)的虛表中查找函數(shù)地址,查找到的還是父類(lèi)的虛函數(shù)地址。因此會(huì)調(diào)用父類(lèi)的虛函數(shù),而不會(huì)調(diào)用子類(lèi)的虛函數(shù)。

析構(gòu)函數(shù)中可以調(diào)用虛擬函數(shù)嗎?

可以。

但是調(diào)用虛擬函數(shù)跟調(diào)用普通函數(shù)沒(méi)啥區(qū)別。

因?yàn)槲鰳?gòu)的時(shí)候先執(zhí)行子類(lèi)的析構(gòu)函數(shù),再執(zhí)行父類(lèi)的析構(gòu)函數(shù),在執(zhí)行當(dāng)前類(lèi)的析構(gòu)函數(shù)的時(shí)候會(huì)先將虛表地址設(shè)置為當(dāng)前類(lèi)的虛表地址,然后再?gòu)奶摫砝锊檎液瘮?shù)地址,因此找到的只能是當(dāng)前的虛函數(shù)的地址。

父類(lèi)的析構(gòu)函數(shù)為什么要為虛函數(shù)?

因?yàn)槿绻割?lèi)析構(gòu)函數(shù)不為虛函數(shù),那么當(dāng)對(duì)象析構(gòu)的時(shí)候只會(huì)調(diào)用指針當(dāng)前類(lèi)型的析構(gòu)函數(shù),不會(huì)調(diào)用父類(lèi)或者子類(lèi)的析構(gòu)函數(shù),會(huì)導(dǎo)致資源泄漏。

如果父類(lèi)的析構(gòu)函數(shù)為虛函數(shù),那么子類(lèi)的析構(gòu)函數(shù)在析構(gòu)的時(shí)候會(huì)先調(diào)用子類(lèi)的析構(gòu)函數(shù),再調(diào)用父類(lèi)的析構(gòu)函數(shù)。這樣子就不會(huì)存在資源泄漏。

注:

(1)將子類(lèi)和父類(lèi)構(gòu)造器和析構(gòu)器調(diào)用串起來(lái)是編譯器實(shí)現(xiàn)的

(2)子類(lèi)和父類(lèi)都有自己的虛表。子類(lèi)或者父類(lèi)的構(gòu)造器和析構(gòu)器在最開(kāi)始都是將虛表設(shè)置為當(dāng)前類(lèi)的虛表。然后才真正調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)里的代碼。

C++構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序

1、構(gòu)造函數(shù)的調(diào)用順序 

基類(lèi)構(gòu)造函數(shù)、對(duì)象成員構(gòu)造函數(shù)、派生類(lèi)本身的構(gòu)造函數(shù)  

2、析構(gòu)函數(shù)的調(diào)用順序

派生類(lèi)本身的析構(gòu)函數(shù)、對(duì)象成員析構(gòu)函數(shù)、基類(lèi)析構(gòu)函數(shù)(與構(gòu)造順序正好相反) 

3、特例 

  • 局部對(duì)象,在退出程序塊時(shí)析構(gòu)
  • 靜態(tài)對(duì)象,在定義所在文件結(jié)束時(shí)析構(gòu)
  • 全局對(duì)象,在程序結(jié)束時(shí)析構(gòu) 
  • 繼承對(duì)象,先析構(gòu)派生類(lèi),再析構(gòu)父類(lèi) 
  • 對(duì)象成員,先析構(gòu)類(lèi)對(duì)象,再析構(gòu)對(duì)象成員
#include "stdafx.h"
#include <iostream>
using namespace std;
class ?Clock
{
public:
?? ?Clock()
?? ?{
?? ??? ?cout << "clock的構(gòu)造函數(shù)" << ",";
?? ?}
?? ?~Clock()
?? ?{
?? ??? ?cout << "clock的析構(gòu)函數(shù)" << ",";
?? ?}
};
class Date
{
public:
?? ?Date()
?? ?{
?? ??? ?cout << "date的構(gòu)造函數(shù)" << ",";
?? ?}
?? ?~Date()
?? ?{
?? ??? ?cout << "date的析構(gòu)函數(shù)" << ",";
?? ?}
};
void main()
{
? ? Clock c;
?? ?Date d;
?? ?system("pause");
}

在使用構(gòu)造函數(shù)和析構(gòu)函數(shù)時(shí),需要特別注意對(duì)它們的調(diào)用時(shí)間和調(diào)用順序。

在一般情況下,調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)的次序相反:最先被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的(同一對(duì)象中的)析構(gòu)函數(shù)最后被調(diào)用,而最后被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的析構(gòu)函數(shù)最先被調(diào)用。

可以簡(jiǎn)記為:先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu),它相當(dāng)于一個(gè)棧,先進(jìn)后出

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解C++語(yǔ)法中的虛繼承和虛基類(lèi)

    詳解C++語(yǔ)法中的虛繼承和虛基類(lèi)

    本文主要介紹了C++語(yǔ)法中的虛繼承和虛基類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 深入淺析C/C++?的條件編譯

    深入淺析C/C++?的條件編譯

    條件編譯是指預(yù)處理的時(shí)候根據(jù)條件編譯的指令有條件的選擇源程序中的一部分代碼送給編譯器進(jìn)行編譯,進(jìn)行有選擇性的操作,防止宏替換的內(nèi)容重復(fù)包含,這篇文章主要介紹了C/C++?的條件編譯,需要的朋友可以參考下
    2022-04-04
  • c與c++之間的相互調(diào)用及函數(shù)區(qū)別示例詳解

    c與c++之間的相互調(diào)用及函數(shù)區(qū)別示例詳解

    這篇文章主要為大家介紹了c與c++相互調(diào)用的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 基于Qt實(shí)現(xiàn)可拖動(dòng)自定義控件

    基于Qt實(shí)現(xiàn)可拖動(dòng)自定義控件

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)可拖動(dòng)自定義控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-04-04
  • C++中set/multiset與map/multimap的使用詳解

    C++中set/multiset與map/multimap的使用詳解

    這篇文章主要為大家詳細(xì)介紹了C++中set/multiset與map/multimap的使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02
  • C++當(dāng)初始化順序變成未定義行為的實(shí)現(xiàn)

    C++當(dāng)初始化順序變成未定義行為的實(shí)現(xiàn)

    本文主要介紹了C++當(dāng)初始化順序變成未定義行為的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • C++實(shí)現(xiàn)五子棋游戲

    C++實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Qt GUI圖形圖像開(kāi)發(fā)之QT表格控件QTableView詳細(xì)使用方法與實(shí)例

    Qt GUI圖形圖像開(kāi)發(fā)之QT表格控件QTableView詳細(xì)使用方法與實(shí)例

    這篇文章主要介紹了Qt GUI圖形圖像開(kāi)發(fā)之QT表格控件QTableView詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下
    2020-03-03
  • 深入串的模式匹配算法(普通算法和KMP算法)的詳解

    深入串的模式匹配算法(普通算法和KMP算法)的詳解

    本篇文章是對(duì)串的模式匹配算法(普通算法和KMP算法)的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 如何在C語(yǔ)言中判斷socket是否已經(jīng)斷開(kāi)

    如何在C語(yǔ)言中判斷socket是否已經(jīng)斷開(kāi)

    如果不主動(dòng)關(guān)閉socket的話(huà),系統(tǒng)不會(huì)自動(dòng)關(guān)閉的,除非當(dāng)前進(jìn)程掛掉了,操作系統(tǒng)把占用的socket回收了才會(huì)關(guān)閉。小編今天跟大家簡(jiǎn)單介紹下如何在C語(yǔ)言中判斷socket是否已經(jīng)斷開(kāi)
    2019-05-05

最新評(píng)論

洛隆县| 乌拉特前旗| 玉山县| 巴彦县| 建水县| 章丘市| 建阳市| 西昌市| 临沧市| 海兴县| 新泰市| 嵩明县| 西林县| 卓尼县| 平泉县| 大丰市| 宁武县| 明溪县| 吕梁市| 扎囊县| 南乐县| 资兴市| 垫江县| 拜城县| 长武县| 墨脱县| 绵竹市| 鞍山市| 新津县| 芮城县| 南宁市| 巴东县| 枣庄市| 丽水市| 广灵县| 巴南区| 武平县| 攀枝花市| 宁国市| 定结县| 科技|