提问者:小点点

C++中的继承:析构函数


我在每个派生类都使用的抽象基类中添加了一个受保护的成员数组,如果基类的析构函数是虚拟的,或者我可以这样做:

**~base(){
   delete[] array;
}**

共2个答案

匿名用户

都是!

您可以为基本析构函数提供定义(即使它是纯虚拟的!)而且,如果基础是资源所在的地方,那么基础就是应该清理资源的地方。

或者,给自己弄一个好的,这样就可以完成所有工作了。

匿名用户

我在抽象基类中添加了一个受保护的成员数组,如果基类的析构函数是虚拟的,则每个派生类都使用该数组

是的。

当您使用多态性时,降序器也应该是虚拟的。

这方面有官方的指导方针:

cppcoreGuidelines/cppcoreGuidelines.md,位于master·isocpp/cppcoreGuideline·GitHub

具有虚函数的类通常(通常)通过指向基的指针来使用。通常,最后一个用户必须在指向基的指针上调用delete,通常通过指向基的智能指针,因此析构函数应该是公共的和虚拟的。不太常见的情况是,如果不打算支持通过指向基的指针进行删除,则析构函数应该受到保护并且是非虚拟的;参见C.35。

struct B {
    virtual int f() = 0;
    // ... no user-written destructor, defaults to public non-virtual ...
};

// bad: derived from a class without a virtual destructor
struct D : B {
    string s {"default"};
};

void use()
{
    unique_ptr<B> p = make_unique<D>();
    // ...
} // undefined behavior, might call B::~B only and leak the string

有些人不遵守此规则,因为他们计划仅通过:使用类;p=std::make_shared<d>(args)/code>这里,共享指针将负责删除,因此不会从基的不适当的中泄漏。坚持这样做的人可能会得到一个假阳性,但是这个规则很重要--如果使用分配了一个呢?除非的作者确保它永远不会被误用,否则它是不安全的,例如通过使所有构造函数私有,并提供一个工厂函数来强制使用进行分配。

    <具有任何虚函数的LIA类应具有公共的虚拟析构函数或受保护的非虚拟析构函数。/LI> 。/li>

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|继承|析|构|函数)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?