C++中基类析构函数为virtual时派生类析构函数是否默认为virtual?
关于派生类析构函数是否默认为virtual的解答
结论
只要基类的析构函数被声明为virtual,派生类的析构函数默认隐式为virtual,你对规则的延伸理解是正确的,普通虚函数的隐式virtual规则完全适用于析构函数场景。
规则解释
C标准对虚函数重写有明确规定:如果基类的某个成员函数被声明为virtual,那么派生类中签名匹配的重写函数,即便不主动添加virtual关键字,也会自动具备虚函数属性。
析构函数属于特殊的重写场景:虽然派生类析构函数的名称和基类析构函数名称看起来不匹配,但C专门对析构函数的重写做了额外约定,只要基类析构是virtual,不管派生类是显式自定义析构、还是使用编译器默认生成的析构,都自动属于虚函数。
针对你给出的代码验证
你提供的示例代码:
class Base { public: virtual ~Base() // note: virtual { std::cout << "Calling ~Base()\n"; } }; class Derived: public Base { public: ~Derived() { std::cout << "Calling ~Derived()\n"; } };
其中Derived类的析构函数已经是隐式虚函数,此时执行如下多态调用:
Base* ptr = new Derived(); delete ptr;
输出顺序为:
Calling ~Derived() Calling ~Base()
完全符合多态析构的预期,不会出现派生类资源泄漏的问题。
补充说明
只有当基类析构函数本身不是virtual时,派生类的析构函数才不会默认是virtual,这种情况下用基类指针指向派生类对象后执行delete,属于未定义行为,通常只会调用基类析构函数,导致派生类申请的资源无法释放。
内容的提问来源于stack exchange,提问作者Karen Baghdasaryan
相关产品推荐
相关产品推荐

