virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决

简介: virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决

问题一:非virtual析构函数版本在继承体系中的析构函数调用情况是什么样的?


非virtual析构函数版本在继承体系中的析构函数调用情况是什么样的?


参考回答:

以下是一个例子,展示了非virtual析构函数版本在继承体系中的析构函数调用情况:

class Point { public: ~Point() { printf("~Point\n"); } }; class Point2d : public Point { public: ~Point2d() { printf("~Point2d\n"); } }; // ... int main() { Point *p2 = new Point2d(); delete p2; // 输出:~Point return 0; }


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/654661


问题二:展示virtual析构函数版本在继承体系中的析构函数调用情况是什么样的?


展示virtual析构函数版本在继承体系中的析构函数调用情况是什么样的?


参考回答:

以下是一个例子,展示了virtual析构函数版本在继承体系中的析构函数调用情况:

class Point { public: virtual ~Point() { printf("~Point\n"); } }; class Point2d : public Point { public: ~Point2d() { printf("~Point2d\n"); } }; // ... int main() { Point *p2 = new Point2d(); delete p2; // 输出:~Point2d~Point return 0; }


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/654662


问题三:为什么在设计基类时,通常会建议将析构函数声明为virtual?


为什么在设计基类时,通常会建议将析构函数声明为virtual?


参考回答:

在设计基类时,将析构函数声明为virtual是为了确保在通过基类指针或引用删除派生类对象时,能够正确地调用派生类的析构函数以及基类析构函数,从而避免资源泄漏和未定义行为。如果没有将基类析构函数声明为virtual,那么在删除派生类对象时,只会调用基类的析构函数,而派生类的析构函数则不会被调用,这可能会导致资源未正确释放或其他问题。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/654663


问题四:为什么在设计中通常建议基类的析构函数声明为virtual?


为什么在设计中通常建议基类的析构函数声明为virtual?


参考回答:

在设计中通常建议基类的析构函数声明为virtual是为了确保当通过基类指针或引用删除派生类对象时,能够正确地调用派生类的析构函数以及基类析构函数,从而避免资源泄漏和未定义行为。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/654664


问题五:滥用virtual会带来哪些副作用?


滥用virtual会带来哪些副作用?


参考回答:

滥用virtual会带来两个明显的副作用:一是每个类会额外增加一个指针大小的内存占用(虚函数表指针),二是函数调用会多一层间接性。这两个特性会带来内存与性能的双重消耗。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/654665

相关文章
|
前端开发 数据库
两个map中的数据,按照相同键,将所对应的值相加方法
两个map中的数据,按照相同键,将所对应的值相加方法
复制宝贝上传,如何批量修改宝贝发货地址
使用大淘营淘宝宝贝复制专家复制宝贝上传到自己店铺时,可以选择复制原宝贝的发货地址(运费模板),也可以使用自己店铺内的运费模板,只要在下载配置的第二步设置一下就可以了,如要复制原宝贝的发货地址,则选择“自动复制或选择运费模板”,如要使用自己店铺内的运费模板,则手动选择一个运费模板。
复制宝贝上传,如何批量修改宝贝发货地址
|
SQL 存储 分布式计算
Hive----执行引擎
执行引擎
587 0
Hive----执行引擎
|
存储 运维 Cloud Native
中国技术出海,TiDB 数据库海外探索之路 | 卓越技术团队访谈录
目前现在的数据库,还没有真正为云原生比如 Serverless 去设计。
488 0
中国技术出海,TiDB 数据库海外探索之路 | 卓越技术团队访谈录
|
算法 Python
【树模型与集成学习】(task5)自适应提升法AdaBoost(更新ing)
自适应提升算法Adaboost,Adaptive Boosting。 自适应是指Adaboost会根据本轮样本的误差结果来分配下一轮模型训练时样本在模型中的相对权重,即对错误的或偏差大的样本适度“重视”,对正确的或偏差小的样本适度“放松”,这里的“重视”和“放松”具体体现在了Adaboost的损失函数设计以及样本权重的更新策略。
601 0
【树模型与集成学习】(task5)自适应提升法AdaBoost(更新ing)
|
编解码 Linux 程序员
Linux驱动开发: FrameBuffe(LCD)驱动开发
Linux驱动开发: FrameBuffe(LCD)驱动开发
1003 0
Linux驱动开发: FrameBuffe(LCD)驱动开发
|
域名解析 编解码 缓存
优酷播放体验优化实战(一)--实战概览
《优酷播放体验优化实战》系列文章持续放送中。 本文将从不同类型播放问题出发,阐述优酷技术团队在播放体验优化实战中的经验
841 0
优酷播放体验优化实战(一)--实战概览
|
弹性计算 数据安全/隐私保护
如何重置和修改阿里云服务器的远程连接密码(图文教程)?
如何重置和修改阿里云服务器的远程连接密码(图文教程)?
2566 0
|
机器学习/深度学习 存储 缓存
ML之sklearn:sklearn的make_pipeline函数、RobustScaler函数、KFold函数、cross_val_score函数的代码解释、使用方法之详细攻略(一)
ML之sklearn:sklearn的make_pipeline函数、RobustScaler函数、KFold函数、cross_val_score函数的代码解释、使用方法之详细攻略