首页 > 编程语言 >C++自学笔记32(虚析构函数)

C++自学笔记32(虚析构函数)

时间:2024-07-29 10:53:29浏览次数:19  
标签:函数 32 派生类 Derived C++ Destructor Base Constructor 虚析构

在以往的笔记中我们讲到过析构函数虚函数。析构函数是释放被初始化的变量,虚函数是告诉编译器有重名的函数被复写去派生类找对应函数。

虚析构函数就是在基类析构函数前加入virtual表示派生类引用析构函数需要找派生类。看以下栗子。

#include <iostream>

class Base
{
publi:
    Base(){std::cout<<Base Constructor<<std::endl;}
    ~Base(){std::cout<<Base Destructor<<std::endl;}
};
class Derived:public Base
{
public:
    Derived(){std::cout<<Derived Constructor<<std::endl;}
    ~Derived(){std::cout<<Derived Destructor<<std::endl;}
};
int mian()
{
    Base* base = new Base();
    delete base;
    std::cout<<"_____________________________________"<<std::endl;
    Derived* derived= new Derived();
    delete derived;
    std::cout<<"_____________________________________"<<std::endl;
    Base* ptr = new Derived();
    delete ptr;
    std::cout<<"_____________________________________"<<std::endl;
    std::cin.get();
}

基类和派生类分别有自己的构造函数和析构函数,打印出的为

Base Constructor

Base Destructor

_____________________________________

Base Constructor

Derived Constructor

Derived Destructor

Base Destructor

_____________________________________

Base Constructor

Derived Constructor

Base Destructor

_____________________________________

我们来逐行解析main中代码,第一块创建Base基本类并删除base,打印对应构造与析构函数没有问题。

第二块创建Derived派生类,因为其基于Base所以需要将Base类初始化和析构一同执行,从打印结果也可以看出先执行基类构造、派生构造、派生析构、基类析构。

第三块代码什么问题,我们创建了Base类指针但实际上指向的是Derived类型指针(new是实际创建的,前面只是命名的)怎么解决呢?

#include <iostream>

class Base
{
publi:
    Base(){std::cout<<Base Constructor<<std::endl;}
    virtual ~Base(){std::cout<<Base Destructor<<std::endl;}
};
class Derived:public Base
{
public:
    Derived(){std::cout<<Derived Constructor<<std::endl;}
    ~Derived(){std::cout<<Derived Destructor<<std::endl;}
};
int mian()
{
    Base* base = new Base();
    delete base;
    std::cout<<"_____________________________________"<<std::endl;
    Derived* derived= new Derived();
    delete derived;
    std::cout<<"_____________________________________"<<std::endl;
    Base* ptr = new Derived();
    delete ptr;
    std::cout<<"_____________________________________"<<std::endl;
    std::cin.get();
}

我们看到没有执行派生类的析构函数,所以我们在基类的析构函数前加上virtual使其变为虚函数。virtual意味着其存在的类存在派生类且析构函数可能会被调用,所以建立一个表供调用时查找。

Base是Derived的基类所以Derived就是Base,注意下类的范围。

Base Constructor

Base Destructor

_____________________________________

Base Constructor

Derived Constructor

Derived Destructor

Base Destructor

_____________________________________

Base Constructor

Derived Constructor

Derived Destructor

Base Destructor

_____________________________________

标签:函数,32,派生类,Derived,C++,Destructor,Base,Constructor,虚析构
From: https://blog.csdn.net/weixin_64418869/article/details/140754754

相关文章

  • 如何在GCP机器上安装pypiwin32模块?
    我想在python中导入win32com然后我使用pipinstallpypiwin32pipinstallpywin32python-mpipinstallpypiwin32python-mpipinstallpywin32导入,但是没有成功并收到错误通知Defaultingtouserinstallationbecausenormalsite-pac......
  • 计算机毕业设计项目推荐,基于Echarts的高校就业数据可视化管理系统 81461(开题答辩+程序
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对高校就业管理等问题,对高校就业管理进行研究分析,然后开发设计出高校就业数据可视化管理系统......
  • C/C++ 头文件注意事项总结
    C/C++头文件在编程中扮演着至关重要的角色,它们用于声明函数、类、宏、常量等,使得这些声明可以在多个源文件中共享。然而,在使用头文件时,需要注意一些关键事项以避免编译错误、提高代码的可维护性和可读性。以下是一些关于C/C++头文件使用的注意事项:1.防止头文件重复包含头文......
  • 最细哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)来源于代码随想录,十分
    20240725一、什么时候适用什么样的结构。1.java中1.1HashSet:1.2TreeSet:1.3LinkedHashSet:1.4HashMap:1.5TreeMap:1.6LinkedHashMap:1.7总结2.c++中2.1std::unordered_set:2.2std::set:2.3std::multiset:2.4std::unordered_map:2.5std::map:2.6std::multimap:3代码......
  • Dev-C++ 的功能与外观优化
    预备安装安装Dev-C++5.11:官方下载:https://sourceforge.net/projects/orwelldevcpp/(若下载缓慢可选择ProblemDownloading->Auto-select)蓝奏云下载:https://wwu.lanzouq.com/iTwwW07r28ni运行安装包即可。更改语言如果界面语言为英文,选择Tools->EnvironmentOptions......
  • OI 中各种输入方式的速度比较(C++,大量实测数据,附图表)
    测试信息本次共测试了以下几种输入方式的速度:scanfcin快读位运算快读fread()+位运算快读关闭同步流的cin开启tie绑定并关闭同步流的cin每组测试各输入方式均使用相同数据,为随机生成的\(1000000\)(1E6)个整数,范围在\([-(2^{31}-1),2^{31}-1]\)(即int范围)。所用......
  • C++ 中缀表达式判断合法性并求值
    中缀表达式值题目描述输入一个中缀表达式(由0−9组成的运算数、加+减−乘∗除/四种运算符、左右小括号组成。注意“−”也可作为负数的标志,表达式以“@”作为结束符)。判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并......
  • VS2022创建C C++ GTEST工程
    原因需要对带代码进行单元测试,选择在Visualstudio中使用GTEST框架。实施创建一个常规的控制台可执行程序。然后使用NUGET安装包安装GTEST头文件和动态库,同时安装GTESTADAPTER。安装可能提示找不到包源,此时需要根据提示配置一下,注意通配符很关键,不要问为甚吗,就是有bug......
  • C++ 笔记(一)数据类型(1)
    1简单的变量变量名命名规则如下变量名称可以包含字母、数字和下划线(_)。变量名称的第一个字符必须是字母或下划线。区分大小写,即大写字母和小写字母被认为是不同的字符。不能使用C++的关键字作为变量名。2数据类型2.1整型short、int、long和longlong这四种类型都是......
  • C++关键字——inline和auto
    目录一、前言 二、inline关键字(C++11)---多用于内联函数a.概念b.特性三、auto关键字(C++11)a.auto简介b.auto的使用细则c.auto不能推导的场景d.基于范围的for循环(C++11)一、前言C++总计63个关键字,我们先了解inline和auto这两个关键字。asmdoifreturntrycontinue......