两个祖先都有一个继承人。两个祖先都有一个具有特定名称的方法。在后继方法中,我需要分配(重载)一个具有相同名称的方法,这将重复这些祖先方法之一。这样,当调用后代的方法时,就会执行祖先之一的同名方法。我堆了这个设计
class Base1 {
private:
int data;
public:
int const & Data() const { return data; }
};
class Base2 {
private:
std::vector<int> data;
public:
Base2() : data{ 1,2,3,4,5,6,7,8,9,0 } {}
std::vector<int> const & Data() const & { return data ; }
std::vector<int> && Data() && { return std::move(data); }
};
class Derived: public Base1, public Base2 {
public:
std::vector<int> const & Data() const & { return Base2::Data(); }
std::vector<int> && Data() && { return std::forward<Base2>(*this).Data(); }
};
constexpr auto WWW() {
return Derived().Data().size(); // тут вызывается Base2::Data() &&
}
int main()
{
Derived obj{};
auto v1 = obj.Data(); // тут вызывается Base2::Data() const
auto v2 = Derived().Data(); // тут вызывается Base2::Data() &&
auto s = WWW();
auto v3 = Base2().Data();
}
再次修复
看起来工作正常(抱歉,我欺骗了自己,然后忘了在哪里。我纠正了)。但第二种方法(Data() &&)不是多余的吗?
&&也许因为我总是只返回对成员字段的常量引用,所以用?编写该方法的第二个版本是没有意义的。或者Data() &&会有不必要的复制v2 = Derived().Data();?我无法从汇编器中理解它。
您不需要了解汇编程序即可理解。您需要将返回类型替换为您自己的类,并记录复制和移动构造函数。确实会有额外的副本。
而且,
std::forward这里看起来不太好。这是有条件的move,因此通常不会立即写入模板std::move()或什么都不写入。我会这样写:std::move(*this).Base2::Data()。或者像这样:static_cast<Base2 &&>(*this).Data()。另外,你
Data根本不能在后代中定义它,而只是简单地创建它using Base2::Data;。