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

相关文章
|
8月前
|
C++
C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?
134 0
|
5月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
5月前
|
编译器 C++
virtual类的使用方法问题之使用virtual函数或virtual析构函数如何解决
virtual类的使用方法问题之使用virtual函数或virtual析构函数如何解决
|
5月前
|
编译器 C++
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
|
5月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
123 4
|
存储 编译器 C语言
C++入门第三篇----类的默认6个成员函数【上篇】——构造函数 析构函数 拷贝构造函数 赋值重载
C++入门第三篇----类的默认6个成员函数【上篇】——构造函数 析构函数 拷贝构造函数 赋值重载
73 0
|
安全
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
|
C#
C# 虚方法(virtual)案例详解
C# 虚方法(virtual)案例详解
228 3