从理论上讲,我认为这个问题的答案是肯定的。

但是,实际上,在以下情况下,我的编译器(VS2010)似乎没有什么提示:我有一个抽象基类,提供了一些公共(public)接口(interface)(还没有数据成员)以及从该子接口(interface)派生的各种子类和子子类。

class Base
{
public:
    Base() {}
    virtual ~Base() {}

    virtual void interfaceFunction1() = 0;
    virtual void interfaceFunction2() = 0;
private:
    Base(const Base&);            // all derived classes should be uncopyable
    Base& operator=(const Base&);

    // no data members
};

我的编译器发现即使在子类或子子类中实现完整拷贝构造函数也没有问题。

如何确保从Base派生的每个类都是不可复制的?

编辑:如果我很好理解,这正是Scott Meyers在Effective C++(2005年第3版)第6项中对Uncopyable类的想法(仅在此处扩展为完整的接口(interface)类)进行了解释。使他的想法起作用的区别是什么? (我知道他是私有(private)继承的,但这不应该造成问题)

最佳答案

这应该防止编译器为未明确声明一个派生类的拷贝构造函数生成一个拷贝构造函数。但是,没有什么可以阻止派生类显式声明一个复制构造函数,除了调用Base的复制构造函数之外,它还会做其他事情。

无法确保派生类是可实例化但不可复制的。

10-07 19:17
查看更多