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

相关文章
|
4月前
|
C++
C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?
55 0
|
30天前
virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决
virtual类的使用方法问题之在设计中通常建议基类的析构函数声明为virtual如何解决
|
30天前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
4月前
|
编译器 C++ 开发者
深入理解virtual关键字
本文从需求、派生类等维度解析了virtual关键字的类,以及介绍了virtual类的使用场景和具体用法。
|
4月前
|
C# 索引
C#学习相关系列之abstract和virtual用法
C#学习相关系列之abstract和virtual用法
|
11月前
|
安全
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
|
C#
C# 虚方法(virtual)案例详解
C# 虚方法(virtual)案例详解
189 3
C#(十八)之C#虚方法virtual
C#中的继承,C#是面向对象语言,面向对象三种特性:封装、继承、多态。 这里主要是继承,本篇只是基础。
158 0
C#(十八)之C#虚方法virtual