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

C++如何在構造函數和析構函數中調用虛擬函數

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

C++構造函數和析構函數中調用虛擬函數

C++構造器可以為虛擬函數嗎?

不行。

因為構造器調用的時候會設置當前類的虛表地址,然后如果構造函數本身為虛擬函數,那么調用構造函數就需要提前訪問虛表,此時虛表指針還沒有指向虛表,就沒法訪問虛表。

構造函數中可以調用虛擬函數嗎?

可以。

但是調用虛擬函數就是調用跟調用普通函數效果一樣。

因為子類在創(chuàng)建的時候是先調用父類的構造器,父類的構造器先設置好父類的虛表地址,然后再執(zhí)行構造器中的代碼,然后在回到子類構造器,先將虛表地址替換為子類的虛表地址,然后執(zhí)行子類構造器的代碼。

因此如果在父類構造器中調用虛函數,那么此時是從父類的虛表中查找函數地址,查找到的還是父類的虛函數地址。因此會調用父類的虛函數,而不會調用子類的虛函數。

析構函數中可以調用虛擬函數嗎?

可以。

但是調用虛擬函數跟調用普通函數沒啥區(qū)別。

因為析構的時候先執(zhí)行子類的析構函數,再執(zhí)行父類的析構函數,在執(zhí)行當前類的析構函數的時候會先將虛表地址設置為當前類的虛表地址,然后再從虛表里查找函數地址,因此找到的只能是當前的虛函數的地址。

父類的析構函數為什么要為虛函數?

因為如果父類析構函數不為虛函數,那么當對象析構的時候只會調用指針當前類型的析構函數,不會調用父類或者子類的析構函數,會導致資源泄漏。

如果父類的析構函數為虛函數,那么子類的析構函數在析構的時候會先調用子類的析構函數,再調用父類的析構函數。這樣子就不會存在資源泄漏。

注:

(1)將子類和父類構造器和析構器調用串起來是編譯器實現(xiàn)的

(2)子類和父類都有自己的虛表。子類或者父類的構造器和析構器在最開始都是將虛表設置為當前類的虛表。然后才真正調用構造函數和析構函數里的代碼。

C++構造函數和析構函數的調用順序

1、構造函數的調用順序 

基類構造函數、對象成員構造函數、派生類本身的構造函數  

2、析構函數的調用順序

派生類本身的析構函數、對象成員析構函數、基類析構函數(與構造順序正好相反) 

3、特例 

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

在使用構造函數和析構函數時,需要特別注意對它們的調用時間和調用順序。

在一般情況下,調用析構函數的次序正好與調用構造函數的次序相反:最先被調用的構造函數,其對應的(同一對象中的)析構函數最后被調用,而最后被調用的構造函數,其對應的析構函數最先被調用。

可以簡記為:先構造的后析構,后構造的先析構,它相當于一個棧,先進后出

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 詳解C++語法中的虛繼承和虛基類

    詳解C++語法中的虛繼承和虛基類

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

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

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

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

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

    基于Qt實現(xiàn)可拖動自定義控件

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

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

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

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

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

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

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

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

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

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

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

    如何在C語言中判斷socket是否已經斷開

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

最新評論

南阳市| 二手房| 上蔡县| 武强县| 肥西县| 阜南县| 清水河县| 平昌县| 新津县| 南城县| 固始县| 瓦房店市| 孟州市| 襄汾县| 河池市| 根河市| 水富县| 平舆县| 江达县| 宁武县| 德庆县| 文昌市| 贵定县| 拉孜县| 德钦县| 西乡县| 云阳县| 桑植县| 宁德市| 郸城县| 冀州市| 嘉峪关市| 昔阳县| 樟树市| 嘉鱼县| 贵南县| 高陵县| 邵阳市| 鄂托克旗| 万荣县| 荥经县|