首页 >后端开发 >C++ >C 中是否应该实现纯虚拟析构函数?

C 中是否应该实现纯虚拟析构函数?

Susan Sarandon
Susan Sarandon原创
2024-12-23 15:56:11341浏览

Should a Pure Virtual Destructor in C   Be Implemented?

C 中的纯虚拟析构函数:一个警示故事

在 C 中定义抽象基类时,可能会倾向于将虚拟析构函数声明为纯虚拟,如如下面的代码片段所示:

class A {
public:
    virtual ~A() = 0;
};

虽然此语法在某些编译器中有效,例如与 MSVC 一样,它会带来潜在的危险,可能导致运行时崩溃。

问题:缺少析构函数实现

上面代码的问题是虚拟析构函数被声明为纯析构函数,没有提供实施。这意味着析构函数的行为被委托给具体的派生类。然而,如果 A 类型的对象本身被销毁,它的析构函数将被调用,并且其缺乏实现将导致未定义的行为。

潜在后果

在典型场景中,派生从抽象基类 A 中调用并尝试销毁派生类的对象最终将调用 A 的析构函数。如果没有实现,这可能会在某些平台上触发未定义的行为,例如调用 purecall 处理程序并使程序崩溃。

解决方案:实现析构函数

为了解决此问题,抽象基类类的析构函数应该显式实现,即使它的主体是空的。下面更正的代码片段演示了这一点:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

通过为 A 的析构函数提供空实现,可以确保在直接调用或通过派生类调用时定义其行为。

以上是C 中是否应该实现纯虚拟析构函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn