问题一:非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