C ++不可复制的类和多重继承,纯抽象类

时间:2012-08-04 14:32:19

标签: c++ interface multiple-inheritance

我们可能同意在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(...) {...};
};
  • 让每个界面都不可复制(这似乎是一个好习惯) 是,为了避免切片)?
  • 添加不可复制的是一个好习惯 每个派生类(明确的保护,但导致多个 继承和钻石问题?)

2 个答案:

答案 0 :(得分:1)

不,让接口不可复制不是一个好主意。例如,这可以防止克隆。

不,在每个派生类中从非可复制派生出来都不是一个好主意,因为它只是多余的。

但是,为了阻止特别是Visual C ++发出愚蠢的警告,在每个应该是不可复制的类中声明一个复制构造函数和复制赋值运算符是个好主意。

答案 1 :(得分:0)

纯虚拟(接口)类无需为使用接口强制执行内存管理。纯虚拟接口的实现应确定自己的内存管理要求(如复制和分配)。

也就是说,值语义允许实现完全避免这种情况。值类(可复制,可分配等)更容易推理和使用。 C ++库中的所有类都是值类。为自己管理内存的值类的一个很好的例子是古老的字符串类。矢量也是一个很好的例子。这些类具有复杂的内部内存管理要求,但作为这些类的用户,我不必关心该类的这一方面。我可以专注于如何使用该课程。

我喜欢presentation中的C++ Now,它显示了多态性如何也是一个实现细节。这包括客户端实现可以参与多态的类的能力,而不需要接口类(或任何基类)。