2012-08-04 86 views
0

我们大概可以认为C++中大多数时候默认的复制构造是不好的,所以最好用C++ 11 =delete或非可复制类如boost::noncopyableC++非可复制类和多继承,纯抽象类

问题是,当我们使用多重继承或公共抽象类时,高级方案会发生什么?

//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(...) {...}; 
}; 
  • 它是一个很好的做法,使每一个接口不可复制的(现在看来,这是 ,避免切片)?
  • 它是一个很好的做法,加上不可复制到 每一个派生类(明确的保障,但导致多个 继承和钻石的问题?)
+1

您的界面根本不像界面。他们定义了构造函数,并且没有纯虚方法(只有某种看起来像违反语法的析构函数)。 – Juliano 2012-08-04 15:17:17

+0

'〜IInterface1(...)= 0'只是语法错误。而且你不想让析构函数变为纯虚拟的。 – 2012-08-04 15:19:02

+0

好的,修好了。使用伪代码,而不是真正的代码。 – Coder 2012-08-04 15:21:32

回答

1

不,这不是一个好主意,使界面非可复制。例如,阻止克隆。

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

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

+0

什么是克隆?像'IInterface1 * ptr = new FImpl();''IInterface1 instA = * ptr;'就我所知是错误的? – Coder 2012-08-04 15:24:42

+0

@Coder:检查[常问问题](http://www.parashift.com/c++-faq-lite/virtual-ctors.html) – 2012-08-04 15:27:34

+0

是一个好主意好吧,知道这种方法存在是很好的,从来没有听说过它。但是,我通常会尽量避免克隆,因为这通常意味着深层副本,关键部分锁,非平凡复制构造函数(如何复制锁定的互斥锁或处理GDI笔刷?)等等。只要有可能,我通常会使用对const的引用。 – Coder 2012-08-04 15:57:38

0

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

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

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

+0

但是字符串和向量是不能从其他类派生的类。 – Coder 2012-08-05 01:26:03