用于提升的虚拟析构函数:不可复制的类?

TER*_*ytE 8 c++ boost noncopyable

我对以下代码有疑问:

class MyClass : private boost::noncopyable
{
    public:

    MyClass() {}
    virtual ~MyClass() {}
}

class OtherClass : private boost::noncopyable
{
    private:
    MyClass* m_pMyClass;
}
Run Code Online (Sandbox Code Playgroud)

我的想法是MyClass无法使用构造或赋值进行复制.如果我想支持从MyClass派生类,我需要使用虚拟析构函数,我不想支持.我不打算创建指向这个类的指针并传递它们.

我不想要一个Singleton,我看不出去除虚拟析构函数的缺点.

如果删除不可复制类的虚拟析构函数,是否会引入潜在问题?是否有更好的实践来处理不需要单例的类,但我只想在另一个类中有一个实例而不支持继承?

Ter*_*fey 13

不,虚拟析构函数的全部意义在于派生类可以正确地多态破坏.如果这永远不会是基类,则不需要它是虚拟的.


Omn*_*ous 9

一般规则是,如果您的类具有虚函数,则需要虚拟析构函数.如果它没有,但仍然是从基类派生的,那么基类(以及你的类)可能需要也可能不需要虚拟析构函数.

从中boost::noncopyable派生类并不真正算作从基类派生. boost::noncopyable更像是一个方便的注释备份了几个声明,这些声明将导致编译器强制执行注释.它不是任何传统意义上的基类.没有人会尝试传递指向您的类的指针作为指针或引用boost::noncopyable.即使他们做了你的虚拟析构函数也无济于事,因为boost::noncopyable析构函数不是.

最后,正如评论中指出的那样,你甚至是私下继承的,boost::noncopyable所以就课堂外的任何人而言,它甚至都不是真正的继承.

所以真的,不需要让它成为虚拟析构函数.