在 C 中定义抽象基类时,可能会倾向于将虚拟析构函数声明为纯虚拟,如如下面的代码片段所示:
class A { public: virtual ~A() = 0; };
虽然此语法在某些编译器中有效,例如与 MSVC 一样,它会带来潜在的危险,可能导致运行时崩溃。
上面代码的问题是虚拟析构函数被声明为纯析构函数,没有提供实施。这意味着析构函数的行为被委托给具体的派生类。然而,如果 A 类型的对象本身被销毁,它的析构函数将被调用,并且其缺乏实现将导致未定义的行为。
在典型场景中,派生从抽象基类 A 中调用并尝试销毁派生类的对象最终将调用 A 的析构函数。如果没有实现,这可能会在某些平台上触发未定义的行为,例如调用 purecall 处理程序并使程序崩溃。
为了解决此问题,抽象基类类的析构函数应该显式实现,即使它的主体是空的。下面更正的代码片段演示了这一点:
class A { public: virtual ~A() = 0; }; inline A::~A() { }
通过为 A 的析构函数提供空实现,可以确保在直接调用或通过派生类调用时定义其行为。
以上是C 中是否应该实现纯虚拟析构函数?的详细内容。更多信息请关注PHP中文网其他相关文章!