gpt4 book ai didi

c++ - 来自基类的复制构造函数

转载 作者:行者123 更新时间:2023-11-30 01:49:32 24 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
#include <utility>

class A {
public:
A() { }
A(const A&, int i) { std::cout << "A copy" << std::endl; }
A(A&&, int i) { std::cout << "A move" << std::endl; }
A(const A&) = delete;
A(A&&) = delete;
};

class B : public A {
public:
B(int i) { std::cout << "B construct" << std::endl; }
B(const A& a) : A(a, 1) { std::cout << "B copy" << std::endl; }
B(A&& a) : A(std::move(a), 1) { std::cout << "B move" << std::endl; }
};


B make_b() {
return B(1);
}

int main() {
B b = make_b();
}

编译报错B cannot be copy-constructed (for return from make_b), because it has no copy-constructor, because A 的复制构造函数被删除。


  • B(const A&) 不符合复制构造函数的条件吗?此处适用的规则是什么?
  • 复制和移动构造函数是否总是必须采用同一类型(而不是父类(super class))的一个参数?
  • 它可以有带默认值的附加参数吗?
  • 能否对其进行模板化以便解析为有效的复制构造函数?
  • 要允许隐式复制和移动构造,是否有必要显式添加复制和移动构造函数 B(const B&)B(B&&)

最佳答案

Does B(const A&) not qualify as copy-constructor, and what is the rule that applies here?

没有。复制构造函数创建另一个相同类型的对象。 AB 的类型不同。如果您尝试从其基类的对象构造派生类的对象,您应该如何初始化派生类的成员?您从中复制的源对象没有要复制的成员!

此外,B 已经有一个由编译器隐式声明的复制构造函数,但是因为隐式定义的格式不正确(因为基类 A 不可复制)它被编译器删除,所以你不能使用它。

Does the copy and move constructor always have to take one argument of the same type (and not a superclass)?

不一定是一个参数,B(const B&, int = 0)是一个复制构造函数,因为它可以被调用来创建一个B的拷贝。但是 B(const A&) 不是复制构造函数。

Can it have additional parameters with default values?

是的。

To allow implicit copy and move construction, is it necessary to explicitly add copy and move-constructors B(const B&) and B(B&&)?

是的,您需要显式定义它们,因为编译器将使用的隐式定义将不起作用。

因为你的派生类型没有任何成员,而你已经有了采用 A 的构造函数,你可以像这样定义它们:

B(const B& b) : B(static_cast<const A&>(b) { }
B(B&& b) : B(static_cast<A&&>(b) { }

这会创建委派构造函数,它只是将参数转发给您现有的构造函数(使用适当的类型转换为基类型)。

关于c++ - 来自基类的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28926482/

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