C 中的纯虚拟析构函数
在面向对象编程的世界中,抽象基类通常需要纯虚拟析构函数。然而,在编写如下代码时会出现问题:
class A { public: virtual ~A() = 0; };
这提出了一个问题:抽象基类拥有纯虚拟析构函数是否可以接受。虽然 Microsoft Visual C 编译它没有问题,但运行时会发生什么?
答案是:未定义的行为。如果从 A 派生的类的实例被删除或销毁,则将调用 A 的析构函数。然而,由于它是纯粹虚拟的并且缺乏实现,这会触发未定义的行为。在某些平台上,这可能会导致调用 purecall 处理程序,从而导致崩溃。
为了避免这种情况,实现析构函数也至关重要。像这样的最小实现就足够了:
class A { public: virtual ~A() = 0; }; inline A::~A() { }
这样,当派生类的实例被删除时,A 的析构函数不会导致未定义的行为。
以上是C 中的抽象基类应该有纯虚拟析构函数吗?的详细内容。更多信息请关注PHP中文网其他相关文章!