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

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

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

C++構造函數(shù)和析構函數(shù)中調用虛擬函數(shù)

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

不行。

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

構造函數(shù)中可以調用虛擬函數(shù)嗎?

可以。

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

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

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

析構函數(shù)中可以調用虛擬函數(shù)嗎?

可以。

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

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

父類的析構函數(shù)為什么要為虛函數(shù)?

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

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

注:

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

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

C++構造函數(shù)和析構函數(shù)的調用順序

1、構造函數(shù)的調用順序 

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

2、析構函數(shù)的調用順序

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

3、特例 

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

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

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

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

總結

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

相關文章

  • VC++實現(xiàn)View內容保存為圖片的方法

    VC++實現(xiàn)View內容保存為圖片的方法

    這篇文章主要介紹了VC++實現(xiàn)View內容保存為圖片的方法,涉及VC++中Bitmap類的save方法相關使用技巧,需要的朋友可以參考下
    2016-08-08
  • 基于Matlab實現(xiàn)離散系統(tǒng)分岔圖的繪制

    基于Matlab實現(xiàn)離散系統(tǒng)分岔圖的繪制

    這篇文章主要介紹了如何利用Matlab實現(xiàn)離散分岔圖的繪制,文中的示例代碼講解詳細,對我們學習Matlab有一定的幫助,需要的可以參考一下
    2022-04-04
  • c語言的形參和實參傳遞的區(qū)別詳解

    c語言的形參和實參傳遞的區(qū)別詳解

    這篇文章主要介紹了c語言的形參和實參傳遞的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++設計與聲明超詳細講解

    C++設計與聲明超詳細講解

    C++軟件開發(fā)可以理解為設計一系列的類,讓這些類相互使用,最終實現(xiàn)我們所需要的功能。類與類之間的相互關系可以很復雜,也可以很簡單,如何簡單高效的描述類與類之間的關系是設計的難點之一。遵循本文所提供的方法,將會給你一些靈感
    2022-09-09
  • VSCode斷點調試CMake工程項目的實現(xiàn)步驟

    VSCode斷點調試CMake工程項目的實現(xiàn)步驟

    這篇文章主要介紹了VSCode斷點調試CMake工程項目的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • c語言實現(xiàn)詞頻統(tǒng)計的簡單實例

    c語言實現(xiàn)詞頻統(tǒng)計的簡單實例

    下面小編就為大家?guī)硪黄猚語言實現(xiàn)詞頻統(tǒng)計的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C/C++ 宏詳細解析

    C/C++ 宏詳細解析

    關于宏的一些語法問題,可以在google上找到。相信我,你對于宏的了解絕對沒你想象的那么多。如果你還不知道#和##,也不知道prescan,那么你肯定對宏的了解不夠
    2013-09-09
  • C++內存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)

    C++內存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)

    C++編譯器會把代碼直接分為四個小區(qū),弄懂這四小區(qū)對我們理解內存有所幫助,所以下面這篇文章主要給大家介紹了關于C++內存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)的相關資料,需要的朋友可以參考下
    2021-07-07
  • C++實現(xiàn)Window環(huán)境聊天室功能

    C++實現(xiàn)Window環(huán)境聊天室功能

    這篇文章主要為大家詳細介紹了C++實現(xiàn)Window環(huán)境聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ 二叉搜索樹(BST)的實現(xiàn)方法

    C++ 二叉搜索樹(BST)的實現(xiàn)方法

    這篇文章主要介紹了C++ 二叉搜索樹(BST)的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的的朋友參考下
    2017-04-04

最新評論