class Base
{
virtual void foo() = 0;
//~Base(); <-- No destructor!
};
显然,Base
将被导出。那么,c++说编译器生成的Base
的析构函数必须是虚的吗?
谢谢!
不,析构函数不会是virtual
,除非你这样标记它。原因很简单——调用可以通过指针和引用进行,而如何以及是否进行调用与是否使用new
创建对象无关。如果您不使用new
创建对象,则不必使用delete
,因此您不需要虚拟析构函数。
没有。这几乎证明析构函数没有自动变为虚函数:
#include <iostream>
struct BaseBase {
~BaseBase() {
std::cout << "~BaseBasen";
}
};
struct Base : BaseBase
{
virtual void foo() = 0;
//~Base(); <-- No destructor!
};
struct Derived : Base {
void foo() { std::cout << "foon"; }
~Derived() {
std::cout << "~Derivedn";
}
};
int main() {
Base *p = new Derived();
delete p;
}
这个程序实际上有未定义的行为,但是我强烈地怀疑在你的实现中它没有打印"~Derived"。如果Base
有虚析构函数,那么它就不会有未定义的行为,并且会输出"~Derived"。
当然它实际上并不能证明任何关于标准的东西。运行它的任何实现都可能是不符合标准的。但是,一旦您尝试了一些,您就会明白,无论标准如何规定,您都需要指定一个虚析构函数。
不,不能保证医生是虚拟的。
在声明要派生的类时,最好是显式地声明一个虚拟医生。这是典型的设计缺陷。事实上,从基类中省略虚拟医生是一种设计缺陷。
No。类可以有虚成员,可以派生,甚至可以在没有虚析构函数的情况下用new
分配和用delete
删除。
如果析构函数没有声明为虚函数,则使用指向基函数的指针销毁 当然,如果你的类要被派生,没有理由不声明虚析构函数。delete
的派生实例是非法的(UB)。