是否可以在不使用基本副本构造函数的情况下在派生类中使用副本构造函数?

时间:2019-03-04 18:02:10

标签: c++ inheritance copy-constructor

我是C ++的新手,从现在开始我学到的是,当我们从Derived类调用副本构造函数时,将调用Base类的副本构造函数。假设我在Base类的私有区域中有一个复制构造函数。如何在不调用Base类的副本构造函数的情况下调用Derived类的副本构造函数? (在这段代码中,A没有复制构造函数的实现,这就是我想知道的内容。)

class NonCopyable
{
protected:
NonCopyable(){}
~NonCopyable(){}
private:
NonCopyable(const NonCopyable& nonCopyable);
NonCopyable& operator=(const NonCopyable& nonCopyable);
};
class A: public NonCopyable
{
};

2 个答案:

答案 0 :(得分:1)

简单的答案是:是的,这是可能的。

您只需要定义一个专用的派生的复制构造函数,该构造函数调用NonCopyable复制构造函数(当然,这在实际的软件应用程序中可能会造成混淆,但这是一个不同的问题):

此类是可构造的,但 是可复制构造的:

class CannotBeCopied: public NonCopyable {};

此类是可构造的,并且也是可复制构造的:

class CanBeCopied: public NonCopyable {
public: 
    CanBeCopied() = default; // needed since otherwise CopyConstructor is only known construtor
    CanBeCopied(const CanBeCopied& b) { } // calls NonCopyable::NonCopyable() default-constructor, which is just protected
};

在此处查看生活示例: http://coliru.stacked-crooked.com/a/60c9fc42fa2dd59a

答案 1 :(得分:0)

经过一番搜索,我找到了一种方法。有一种方法可以调用Derived类的副本构造函数,而无需调用Base类的副本构造函数。我们要做的就是在A中构建复制构造函数,而A在复制构造函数为私有的情况下继承了NonCopyable的构造函数:

class NonCopyable
{
protected:
    NonCopyable(){}
    ~NonCopyable(){}
private:
    NonCopyable(const NonCopyable& nonCopyable);
    NonCopyable& operator=(const NonCopyable& nonCopyable);
};
class A: public NonCopyable
{
public:
    A(){}
    A(const A& other){}
};