【发布时间】:2012-08-04 14:32:18
【问题描述】:
我们可能同意默认复制构造在 C++ 中大部分时间都很糟糕,因此最好使用 C++11 =delete 或像 boost::noncopyable 这样的不可复制类显式禁用它。
问题是,当我们使用多重继承或公共抽象类时,在高级场景中会发生什么?
//Class uncopyable
class uncopyable {...};
//Interface1
class IInterface1 : private uncopyable
{
public:
IInterface1(...)
virtual ~IInterface1(...) = 0;
};
//Interface2
class IInterface2 : private uncopyable
{
public:
IInterface2(...)
virtual ~IInterface2(...) = 0;
};
//Fancy implementation
//FImpl
class FImpl : public IInterface1, public IInterface2, private : uncopyable
{
public:
FImpl(...) {...}
~FImpl(...) {...};
};
- 让每个接口都不可复制是一种好习惯吗(似乎 是,为了避免切片)?
- 将不可复制添加到 每个派生类(显式保护,但会导致多个 继承和钻石问题?)
【问题讨论】:
-
您的界面看起来根本不像界面。它们定义了构造函数,并且没有纯虚方法(只有某种看起来像违反语法的析构函数)。
-
~IInterface1(...) = 0只是语法错误。而且你不想让析构函数成为纯虚拟的。 -
好的,已修复。使用伪代码,而不是真正的代码。
-
大多数时候,默认的复制结构还不错。在少数情况下是这样。以这种方式开始你的问题对讨论没有帮助。
-
@Coder:Google 指南不是通用的,它们似乎是为 Google 团队优化的(我想这包括比 C++ 更多的 Java 专业知识)。三法则说,只有当你定义一个自定义赋值运算符或析构函数时,默认的复制构造函数才不好,这不是大多数类。
标签: c++ interface multiple-inheritance