如何实现菱形继承的move构造函数
How to implement a move constructor for a diamond-shaped inheritance?
我有一个菱形的类层次结构,其中没有默认构造函数,也没有复制构造函数。我有两个构造函数,一个是"移动",另一个是对对象的左值引用:
struct base {
base(base&&) = default;
base(member_type&& m): member_(std::move(m)) {}
member_type member_;
};
struct virt_1: virtual base {
virt_1(virt_1&& rhs): base(std::move(rhs)) {}
virt_1(member_type&& m): base(std::move(m)) {}
};
struct virt_2: virtual base {
virt_2(virt_2&& rhs): base(std::move(rhs)) {}
virt_2(member_type&& m): base(std::move(m)) {}
};
struct concrete: virt_1, virt_2 {
concrete(concrete&& rhs) // ???
};
除了不使用菱形层次结构之外,是否可以为具体类实现move构造函数?
谢谢!
要求编译器提供实现有什么问题?
concrete(concrete&&) = default;
我也将virt_1
和virt_2
移动构造函数定义为默认构造函数。
如果你真的想写出来的话:
concrete(concrete&& rhs)
: base(std::move(rhs)), virt_1(std::move(rhs)), virt_2(std::move(rhs))
{ }
或者如果你真的喜欢打字:
concrete(concrete&& rhs)
: base(static_cast<base&&>(rhs)),
virt_1(static_cast<virt_1&&>(rhs)),
virt_2(static_cast<virt_2&&>(rhs))
{ }
virt_1
和virt_2
基的初始化器是无用的,因为它们只调用base
构造函数,因为它是一个虚拟基,所以当concrete
调用它时,它们不会这么做,但由于您选择了构造函数,您不能默认地构造它们,并且需要用右值初始化它们,即使它们对它什么都不做。
当然。层次结构中任何具有virtual
基的构造函数都负责初始化该基。从本质上讲,层次结构中virtual
基以下的任何类都会继承初始化该基的权限。
在这种情况下,默认的move构造函数应该做正确的事情。我还建议指定concrete : private virtual base
来澄清发生了什么。
这是一个工作演示。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 关于std::move的使用,是否有编译警告
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 通过实例理解std::move及其目的
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 如何实现菱形继承的move构造函数