是否可以在 Derived class 中使用复制构造函数而不使用 Base 复制构造函数?
Is it possible to use a copy constructor in Derived class without using Base copy constructor?
我是 C++ 的新手,从我到现在所学的知识来看,当我们从 Derived class 调用复制构造函数时,会调用 Base class 的复制构造函数。假设我在 Base class 的私有区域中有一个复制构造函数。如何在不调用 Base class 的复制构造函数的情况下调用 Derived class 的复制构造函数? (在此代码中,A 没有复制构造函数的实现,这是我想知道的)。
class NonCopyable
{
protected:
NonCopyable(){}
~NonCopyable(){}
private:
NonCopyable(const NonCopyable& nonCopyable);
NonCopyable& operator=(const NonCopyable& nonCopyable);
};
class A: public NonCopyable
{
};
经过一番搜索,我找到了一个方法。有一种方法可以在不调用 Base class 的复制构造函数的情况下调用 Derived class 的复制构造函数。我们要做的就是在A中构建拷贝构造函数,A继承NonCopyable的构造函数,而拷贝构造函数是private的:
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){}
};
简单的回答是:是的,这是可能的。
您只需要定义一个专用的 Derived 复制构造函数,它 不会 调用 NonCopyable 复制构造函数(当然这在实际软件应用程序中可能会造成混淆,但是这是一个不同的问题):
这个class是可构造的,但是不是可复制构造的:
class CannotBeCopied: public NonCopyable {};
这个class是可构造的,也是可复制构造的:
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
我是 C++ 的新手,从我到现在所学的知识来看,当我们从 Derived class 调用复制构造函数时,会调用 Base class 的复制构造函数。假设我在 Base class 的私有区域中有一个复制构造函数。如何在不调用 Base class 的复制构造函数的情况下调用 Derived class 的复制构造函数? (在此代码中,A 没有复制构造函数的实现,这是我想知道的)。
class NonCopyable
{
protected:
NonCopyable(){}
~NonCopyable(){}
private:
NonCopyable(const NonCopyable& nonCopyable);
NonCopyable& operator=(const NonCopyable& nonCopyable);
};
class A: public NonCopyable
{
};
经过一番搜索,我找到了一个方法。有一种方法可以在不调用 Base class 的复制构造函数的情况下调用 Derived class 的复制构造函数。我们要做的就是在A中构建拷贝构造函数,A继承NonCopyable的构造函数,而拷贝构造函数是private的:
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){}
};
简单的回答是:是的,这是可能的。
您只需要定义一个专用的 Derived 复制构造函数,它 不会 调用 NonCopyable 复制构造函数(当然这在实际软件应用程序中可能会造成混淆,但是这是一个不同的问题):
这个class是可构造的,但是不是可复制构造的:
class CannotBeCopied: public NonCopyable {};
这个class是可构造的,也是可复制构造的:
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