gpt4 book ai didi

c++ - 禁止在继承类中定义复制构造函数

转载 作者:可可西里 更新时间:2023-11-01 15:49:20 30 4
gpt4 key购买 nike

我想让一个抽象基类不可复制,并强制从它派生的任何类都不可复制。下面的代码使用了 Boost 的 noncopyable,定义在 noncopyable.hpp 中。但仍然允许派生类 D 定义复制构造函数。

class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private: // emphasize the following members are private
noncopyable( const noncopyable& );
const noncopyable& operator=( const noncopyable& );
};

class D : noncopyable
{
public:
D() { }
D(const D&) { }
};

int main()
{
D a;
D b(a);

return 0;
}

此代码编译并运行(http://ideone.com/g4gGLm),而我预计它会抛出有关 D 的复制构造函数的编译时错误。也许我误解了这个不可复制类的用途。如果是这样,有没有办法强制派生类不定义复制构造函数? (回答可以用C++11,但最好不要boost)

最佳答案

之所以可行,是因为 D(const D&) 调用了基类的默认构造函数,而不是复制构造函数。 (起初违反直觉,但考虑到所有构造函数的行为都是这样的,这是有道理的)

因为没有调用复制构造函数,所以不会创建基对象的拷贝,除非您明确要求:

D(const D& d) : noncopyable(d) { }

这确实会导致错误。所以实际上,您的问题不是问题 - 没有 noncopyable 的复制正在进行。

我不知道有什么直接的方法可以强制派生类禁止复制,如果有的话我也不推荐使用。

关于c++ - 禁止在继承类中定义复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15475823/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com