当不需要虚拟析构函数时,即使有虚函数,为什么?

sky*_*oor 2 c++

它说如果有一个虚函数,那么拥有一个虚拟析构函数是一个好习惯.但是,如果对象是在堆栈上创建但不在堆上创建的,那么我们仍然需要这样做吗?

问候,

Mic*_*urr 9

严格来说不是 - 如果对象将通过引用基础对象的指针销毁,则只需要虚拟析构函数.

如果破坏时的静态类型是对象的实际类型,则无论是否为虚拟,都将调用正确的dtor.

但是如果一个类具有虚函数,那么其原因通常是可以通过指针或对其中一个对象库的引用来访问它.如果要通过该机制销毁对象,则使用虚拟dtor将确保调用正确的对象.如果你有一个虚拟功能,那么dtor虚拟就可以免费使用.

  • 虽然这是完全正确的,但我认为Justin Ethier的回答是"整体"答案的关键部分.严格地说,考虑到问题中的事实,不,析构函数不需要是虚拟的.但是,如果您包含虚拟方法,则假定该类将被子类化.您也只是假设您使用基类指针或引用来访问它.因此,除非你能保证它永远不会在堆上创建,否则你需要*一个虚拟析构函数. (4认同)

Jus*_*ier 7

是的,因为其他人可以编写在堆上创建对象的新代码.你的班级认为它总是会在堆栈上创建,这是不好的做法......