在这种情况下,我的派生 class 还需要一个虚拟析构函数吗?
Do I still need to have a virtual destructor for my derived class in this situation?
我一直在阅读 Scott Meyers 的《Effective C++》第 3 版,在其中一章中他说任何 class 带有虚函数的东西几乎都应该有一个虚析构函数。现在对于我下面的代码,函数 someFunc
不需要派生的 class 中的虚函数。但是,我决定将它放在那里以显示语义并提高可读性。既然我把 virtual 放在那里,是否意味着派生的 class 中的析构函数必须是 virtual?
#include <iostream>
using namespace std;
class base
{
public:
base(){...}
virtual ~base(){...}
virtual someFunc() = 0;
};
class derived1:public base
{
public:
derived1(){...}
~derived1(){...} //Does this need to be virtual?
virtual someFunc(/*Implement the function*/); //I made this virtual just to show meaning
};
int main()
{
base* b;
b=new derived1;
delete b; //Will this cause a memory leak?
}
已经是了!
virtual
关键字对于您的 derived::someFunc
和 derived::~derived
是隐含的,因为这两个函数的基本等效项都标记为 virtual
.
因此,您可以在两者上都写关键字 virtual
,也可以两者都写,也可以只在一个上写。没关系:无论如何它们实际上都是虚拟的。
是,你仍然需要一个用于派生 class.
的虚拟析构函数
但是没有,你不需要在上面使用virtual
,也根本不需要声明它:
基础-class-版本是虚拟的自动使派生版本成为虚拟的,您无需做任何事情。
只要父析构函数之前有一个 virtual,它会自动调用子析构函数中的析构函数 class 当您删除分配的内存时,您不必将 virtual 放入子析构函数中。
我一直在阅读 Scott Meyers 的《Effective C++》第 3 版,在其中一章中他说任何 class 带有虚函数的东西几乎都应该有一个虚析构函数。现在对于我下面的代码,函数 someFunc
不需要派生的 class 中的虚函数。但是,我决定将它放在那里以显示语义并提高可读性。既然我把 virtual 放在那里,是否意味着派生的 class 中的析构函数必须是 virtual?
#include <iostream>
using namespace std;
class base
{
public:
base(){...}
virtual ~base(){...}
virtual someFunc() = 0;
};
class derived1:public base
{
public:
derived1(){...}
~derived1(){...} //Does this need to be virtual?
virtual someFunc(/*Implement the function*/); //I made this virtual just to show meaning
};
int main()
{
base* b;
b=new derived1;
delete b; //Will this cause a memory leak?
}
已经是了!
virtual
关键字对于您的 derived::someFunc
和 derived::~derived
是隐含的,因为这两个函数的基本等效项都标记为 virtual
.
因此,您可以在两者上都写关键字 virtual
,也可以两者都写,也可以只在一个上写。没关系:无论如何它们实际上都是虚拟的。
是,你仍然需要一个用于派生 class.
的虚拟析构函数但是没有,你不需要在上面使用virtual
,也根本不需要声明它:
基础-class-版本是虚拟的自动使派生版本成为虚拟的,您无需做任何事情。
只要父析构函数之前有一个 virtual,它会自动调用子析构函数中的析构函数 class 当您删除分配的内存时,您不必将 virtual 放入子析构函数中。