virtual类的使用方法问题之使用virtual函数或virtual析构函数如何解决

简介: virtual类的使用方法问题之使用virtual函数或virtual析构函数如何解决

问题一:在非必需的情况下,为什么不建议将析构函数声明为virtual?


在非必需的情况下,为什么不建议将析构函数声明为virtual?


参考回答:

在非必需的情况下,不建议将析构函数声明为virtual,因为这会带来额外的内存和性能开销。即使内存消耗只是一个指针大小,但在类成员很少的情况下,也会带来显著的内存膨胀。同时,virtual会引入构造函数的强制合成,这可能导致性能进一步下降。


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


问题二:如何理解“构造函数的强制合成”与virtual析构函数的关系?


如何理解“构造函数的强制合成”与virtual析构函数的关系?


参考回答:

当类中声明了virtual析构函数时,编译器需要确保虚函数表指针被正确安插和初始化。因此,编译器会在类的构造函数中增加一个额外的步骤来执行这个操作。这个过程称为构造函数的强制合成。这个额外的步骤会增加构造函数的执行时间,从而可能导致性能下降。


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


问题三:使用clang++ -o demo demo.cpp编译后,如何查看Point2d和VPoint2d


使用clang++ -o demo demo.cpp编译后,如何查看Point2d和VPoint2d


参考回答:

使用nm demo | grep Point2d命令可以查看Point2d和VPoint2d的相关符号。这将列出与这两个类相关的所有符号,包括成员函数和变量等。


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


问题四:为什么VPoint2d会自动合成构造和析构函数,而Point2d不会?


为什么VPoint2d会自动合成构造和析构函数,而Point2d不会?


参考回答:

VPoint2d会自动合成构造和析构函数是因为它声明了virtual析构函数。在C++中,当类中包含虚函数(包括虚析构函数)时,编译器会自动为该类合成虚函数表(vtable)和虚函数表指针(vptr),并可能合成构造函数和析构函数以确保vptr的正确初始化和销毁。而Point2d没有声明任何虚函数,因此不需要合成这些函数。


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


问题五:mac机器上,Point2d和VPoint2d的执行效率有何不同?


mac机器上,Point2d和VPoint2d的执行效率有何不同?


参考回答:

在作者的mac机器上,Point2d和VPoint2d的执行效率存在显著差异。Point2d的执行效率更高,而VPoint2d由于虚函数表指针的额外开销和构造函数的强制合成,性能耗时增加了约70.32%。


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


问题六:在什么情况下应该使用virtual函数或virtual析构函数?


在什么情况下应该使用virtual函数或virtual析构函数?


参考回答:

应该在以下两种情况下使用virtual函数或virtual析构函数:

在继承中使用多态能力的时候,需要使用virtual函数机制。这允许通过基类指针或引用来调用派生类的成员函数,实现运行时多态。

当基类指针指向子类实例的时候,需要使用virtual析构函数。这确保在删除基类指针指向的派生类对象时,能够正确调用派生类的析构函数,避免资源泄漏和未定义行为。


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

相关文章
|
8月前
|
C++
C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?
128 0
|
5月前
virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决
virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决
|
5月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
C#学习virtual(虚拟的)和abstract(抽象的)的区别
C#学习virtual(虚拟的)和abstract(抽象的)的区别
154 0
|
8月前
|
C# 索引
C#学习相关系列之abstract和virtual用法
C#学习相关系列之abstract和virtual用法
|
C#
C# 虚方法(virtual)案例详解
C# 虚方法(virtual)案例详解
224 3
|
测试技术 C#
C#语法-虚方法详解 Virtual 虚函数
虚方法 / Virtual 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心...
1165 0

热门文章

最新文章