在 C++ 继承中,当指向基类的指针对象指向派生类时,不会调用派生类析构函数

2023-12-24

我是新手,我知道这是一个非常基本的概念,也可能是重复的。 一旦调用了构造函数,就必须调用其相应的析构函数,这不是真的吗? [在 Dev C++ 上运行的代码]

class Base
    {
     public:
            Base() { cout<<"Base Constructor\n";}
            int b;
     ~Base() {cout << "Base Destructor\n"; }
    };

class Derived:public Base
{
 public:
        Derived() { cout<<"Derived Constructor\n";}
        int a;
 ~Derived() { cout<< "Derived Destructor\n"; }
}; 
int main () {
Base* b = new Derived;    
//Derived *b = new Derived;
 delete b;
    getch();
    return 0;
}

给出输出

Base Constructor
Derived Constructor
Base Destructor

您的代码有未定义的行为。基类的析构函数必须是virtual让以下内容具有定义的行为。

Base* b = new Derived;    
delete b;

来自 C++ 标准:

5.3.5 删除

3 在第一个替代方案(删除对象)中,如果静态类型 操作数与其动态类型不同,静态类型应是操作数动态类型的基类,并且静态类型应具有虚拟析构函数,否则行为未定义。

所以在你的情况下,静态类型是Base,动态类型为Derived。所以Base的析构函数应该是:

virtual ~Base() {cout << "Base Destructor\n"; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 继承中,当指向基类的指针对象指向派生类时,不会调用派生类析构函数 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 浮动嵌套div的填充高度

    我正在制作一个基本的评论系统 当评论很短时它是完美的 但是当用户写很多时 评论并不像应有的那么花哨 我尝试用高度 100 但它并没有像我预期的那样工作 我希望作者信息填写评论的高度 到目前为止我尝试过的 http jsfiddle net
  • 从新的 youtu.be 网址获取视频 ID

    我有以下代码 可以从旧的共享网址中获取 youtube 的视频 id youtube com watch v adasdalkjsd url GET url parse str parse url url PHP URL QUERY que
  • Glassfish 线程池、接受器线程、HTTP 最大连接数

    请参阅附图 请帮助我理解线程池 最大和最小线程池大小 接受器线程及其最大连接数和 HTTP 最大连接数之间的关系 线程池 HTTP 传输TCP 首先我给你一些官方文档 线程池 线程池是服务器可以处理的并发请求的最大数量 服务器有一个连接队列
  • 使用 EF 和 WebApi 序列化父/子对象

    我在实体框架内有以下模型 public class Customer XmlIgnore public virtual ICollection
  • 刷新/重新启动 PowerShell 会话而不退出

    我一直在调整我的 PowerShell 配置文件中的一些脚本 退出 powershell 然后重新启动它很烦人 这样它就会加载我对我的配置文件中的脚本所做的任何更改 是否可以在不退出的情况下重新启动 powershell 会话 你可以这样做
  • Rails 4 参数数量错误(2 为 1)。可能是 Strong_params 问题

    我将 Rails 4 与 Devise Cancan 和 Rollify 一起使用 我有一个用户索引 其中包含更改角色的模式 但是 当我尝试更新角色时 出现以下错误 参数数量错误 2 为 1 错误发生在我的用户控制器代码的第 16 行 13
  • Oracle 11g 通过正则表达式获取所有匹配的出现

    我正在使用 Oracle 11g 我想使用 REGEXP SUBSTR 来匹配给定模式的所有出现情况 例如 SELECT REGEXP SUBSTR Txa233141b Ta233141 Ta233142 Ta233147 Ta23314
  • Animate.css动画完成后动画消失

    我正在尝试构建一个菜单 每个列表项都有一系列动画 它有效 但动画结束后该项目再次消失 看起来 animated 的可见属性没有被使用 您可以给我任何指示来解决这个问题吗 ul class menu ani item li class ani
  • E:存储库“http://archive.ubuntu.com/ubuntu precision Release”未签名

    我正在尝试通过运行此命令在本地设置 Scrapy docker env docker build t scrapy 我遇到以下错误 Get 20 http archive ubuntu com ubuntu http archive ubu
  • Chrome CustomTabs CustomTabsCallback onPostMessage 未调用

    我正在尝试在 Android 上使用 Chrome CustomTabs 但在使用 CustomTabsCallback 时遇到问题 因此 我在网上搜索了一些在我的代码中实现的示例或文档 但不幸的是我没有找到任何东西 我需要接收托管网页发送
  • Java 中的事件监听器和处理程序有什么区别?

    一般来说 java 中有事件的侦听器和处理程序 我的意思是我在不知不觉中使用它们 只是 API 中可用的 我的问题是 在什么情况下我们使用侦听器以及在什么情况下使用事件处理程序 他们之间有什么区别 特征 我搜索了原因 但找不到 Java 的
  • ConEmu 与 Git Bash - 在选项卡栏中显示文件夹

    我通常在 ConEmu 选项卡中运行 Git Bash 在每个 Git Bash 实例的选项卡栏中显示当前目录的名称确实很方便 但如果我将选项卡模板设置为 d or f 无论我在哪里 我总是可以获得我的 Windows 主目录cd到 Git
  • Apple OS X Server(Xcode CI 服务)找不到配置文件

    我配置了带有 OS X Server 的专用 Mac mini 以便与 XCode5 持续集成 添加了 git 存储库并创建了机器人 我正在尝试集成机器人并收到错误 Specified PROVISIONING PROFILE 29DAD4
  • 如何禁用 Hadoop Kerberos

    我使用内部脚本来设置 Hadoop 集群 默认情况下 它使用 Kerberos 配置 Hadoop 安全性 这对于开发环境来说是非常不方便的 我用谷歌搜索了很多 但结果都是关于 如何启用 请帮忙给一些参考或者建议 更改以下值 core si
  • 将供应商 Android 更改集成到 aosp 中

    我正在尝试将 AOSP 设备更改集成到标准 AOSP 本地镜像中 这有点令人困惑 但我会尽力尽可能清楚 我在服务器 不同的本地计算机 上创建了 AOSP 存储库的本地镜像 供应商补丁基于标签 android 4 3 r2 1 所以我初始化了
  • 如何在 DataFrame 中跨组使用 QuantileDiscretizer?

    我有一个包含以下列的数据框 scala gt show times printSchema root account string nullable true channel string nullable true show name s
  • 创建用自定义令牌交换 .Net Auth Cookie 的 Owin Auth 提供程序

    我正在尝试在 2 个 Net 应用程序之间创建类似 SSO 的解决方案 Net 应用程序 1 有一个自定义令牌生成器和端点来验证返回用户信息的令牌 Net 应用程序 2 使用 Owin 进行保护 是一个典型的独立应用程序 用户可以使用密码和
  • JMS - 消息选择器如何与多个队列和主题消费者一起工作?

    假设您有一个 JMS 队列 并且多个使用者正在监视队列中的消息 您希望其中一个消费者获得所有特定类型的消息 因此您决定采用消息选择器 http java sun com j2ee sdk 1 3 techdocs api javax jms
  • has_many :通过+多态关系

    我使用rails3并尝试建立一些复杂的关联 我有产品 版本和属性模型 class Version lt ActiveRecord Base belongs to product has many specs has many propert
  • 在 C++ 继承中,当指向基类的指针对象指向派生类时,不会调用派生类析构函数

    我是新手 我知道这是一个非常基本的概念 也可能是重复的 一旦调用了构造函数 就必须调用其相应的析构函数 这不是真的吗 在 Dev C 上运行的代码 class Base public Base cout lt lt Base Constru