当虚拟析构函数被声明但没有实现时会发生什么?

What happens when virtual destructors are declared, but have no implementation?

在 C++ 中,我们可以完美地在头文件中声明一个函数,而无需实际实现它。这编译得很好,通常这不会提供任何问题,但是......我想知道当未实现虚拟析构函数时它是否会导致问题。

当未实现虚拟析构函数时,在这种情况下,当我们通过基class的指针删除派生class的实例时,派生[=20]的析构函数=] 还叫吗?

例如

class Base{
public:
    virtual ~Base() {}
};

class Derived: public Base {
public:
    ~Derived(); // HAS NO IMPLEMENTATION
};

Base *b = new Derived();
delete b;

注意:正如评论中指出的那样,上述示例并不 LINK 正确。此处提供它是为了解释我试图获得更多见解的情况,但实际上在链接过程中,此示例将导致 undefined reference to Derived 错误。

如果您曾经调用 ~Derived()(例如通过删除 b),您将收到链接错误,因为析构函数的符号不存在。由于 ~Base() 是虚拟的,当您删除 b 时,~Derived() 仍将(尝试)被调用。没有实施与此无关。

What happens when virtual destructors are declared, but have no implementation?

如果曾经调用过析构函数(例如在您的示例中),则程序违反了一个定义规则,因此是 ill-formed。标准不需要诊断,编译器将无法判断有什么问题。但幸运的是,您可能会因链接器错误而得救。

In C++ we can perfectly declare a function in a header file without actually implementing it.

这是真的。但是我们不能调用这样的函数。


virtualdestructor 与问题关系不大。这些规则适用于所有函数。