将用户定义的默认虚拟析构函数添加到类似的类中时。
class Foo
{
public:
Foo();
virtual ~Foo() = default;
};
..它具有防止自动生成移动构造函数的副作用。也不推荐自动生成复制构造函数。 A recommended way is to user define all constructors喜欢这个..
class Foo
{
public:
Foo();
virtual ~Foo() = default;
Foo(const Foo& /* other */) = default;
Foo&operator=(const Foo& /* other */) = default;
Foo(Foo&& /* other */) = default;
Foo&operator=(Foo&& /* other */) = default;
};
然而,这是超级冗长且不可读的。还有其他解决方案吗?
答案 0 :(得分:4)
首先,我会考虑Foo
是否真的需要虚拟析构函数。也许您可以使用简单的模板以类型安全的方式解决您的问题,从而避免乱搞指针和投射等等。
如果您决定将Foo
设为虚拟,那么我会推荐这种抽象。
class VirtualDestructor
{
protected:
VirtualDestructor() = default;
virtual ~VirtualDestructor() = default;
VirtualDestructor(const VirtualDestructor & /* other */) = default;
VirtualDestructor &operator=(const VirtualDestructor & /* other */) = default;
VirtualDestructor(VirtualDestructor && /* other */) = default;
VirtualDestructor &operator=(VirtualDestructor && /* other */) = default;
};
将它放在适当的namespace
的库中。然后,您可以保持Foo
和所有其他虚拟类清洁。
class Foo : VirtualDestructor
{
public:
Foo();
};
删除例如复制构造函数时也可以使用相同的技术。