编译器生成的抽象基类析构函数是否为虚函数?


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)。

当然,如果你的类要被派生,没有理由不声明虚析构函数。

相关内容

  • 没有找到相关文章

最新更新