Mat*_*ias 4 c++ virtual-destructor c++11
将用户定义的默认虚拟析构函数添加到这样的类时..
class Foo
{
public:
Foo();
virtual ~Foo() = default;
};
Run Code Online (Sandbox Code Playgroud)
.. 它具有防止自动生成移动构造函数的副作用。也不推荐自动生成复制构造函数。推荐的方法是用户像这样定义所有构造函数..
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;
};
Run Code Online (Sandbox Code Playgroud)
然而,这是非常冗长和不可读的。有没有其他解决方案?
首先我会考虑是否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;
};
Run Code Online (Sandbox Code Playgroud)
把它放在一个合适的库中namespace。然后你可以保持Foo和所有其他虚拟类清洁。
class Foo : VirtualDestructor
{
public:
Foo();
};
Run Code Online (Sandbox Code Playgroud)
删除例如复制构造函数时也可以使用相同的技术。
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |