将基类对象分配给派生类对象
为什么在以下代码中获得error: no match for ‘operator=’ in ‘y = x’
?
不能只将b的a分量分配为像是a-object = a-object
?将基类对象分配给派生类对象
struct a {int i;};
struct b : public a {int j;};
int main()
{
a x;
b y;
x.i = 9;
y.j = 5;
y = x; // error: no match for ‘operator=’ in ‘y = x’
// expected: y.i = 9
return 0;
}
您没有明确定义任何赋值运算符,因此编译器将为每个结构生成它自己的默认运算符。编译器的默认赋值运算符b
以b
作为输入,并将分配这两个成员。使用继承时,赋值运算符不会自动继承。这就是为什么你无法将a
传递给b
- b
中没有任何赋值运算符,它将a
作为输入。如果你想允许,你需要尽可能多的告诉编译器,如:
struct a
{
int i;
a& operator=(const a &rhs)
{
i = rhs.i;
return *this;
}
};
struct b : public a
{
int j;
using a::operator=;
b& operator=(const b &rhs)
{
*this = static_cast<const a&>(rhs);
j = rhs.j;
return *this;
}
};
int main()
{
a x;
b y;
b z;
...
y = x; // OK now
y = z; // OK as well
...
return 0;
}
如果我处理这样的任务可以吗? [链接](http://ideone.com/NZBtVG) – 2013-05-10 08:16:31
不,因为即使这些类是相关的,它们也是不同的类型。
想想这个,即使它被允许并且它可以像你期望的那样工作,那么y.j
的值在分配之后会是什么?
我希望它未经修改。我认为只有从a派生出来的b的部分被分配给了。 – 2013-05-10 07:54:25
由于错误状态,您需要实现赋值运算符。也就是说,一个函数告诉程序如何将一个对象分配给另一个对象。如果您在网上搜索,您可以找到大量的信息。 on http://www.cplusplus.com/articles/y8hv0pDG/
我怀疑你想使用指针或引用这里 – 2013-05-10 07:55:14
结构是值类型,不能分配给其他类型 – mojtaba 2013-05-10 07:55:49