我在每个派生类都使用的抽象基类中添加了一个受保护的成员数组,如果基类的析构函数是虚拟的,或者我可以这样做:
**~base(){
delete[] array;
}**
都是!
您可以为基本析构函数提供定义(即使它是纯虚拟的!)而且,如果基础是资源所在的地方,那么基础就是应该清理资源的地方。
或者,给自己弄一个好的
我在抽象基类中添加了一个受保护的成员数组,如果基类的析构函数是虚拟的,则每个派生类都使用该数组
是的。
当您使用多态性时,降序器也应该是虚拟的。
这方面有官方的指导方针:
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
有些人不遵守此规则,因为他们计划仅通过