将基类对象分配给派生类对象

问题描述:

为什么在以下代码中获得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; 
} 
+0

我怀疑你想使用指针或引用这里 – 2013-05-10 07:55:14

+0

结构是值类型,不能分配给其他类型 – mojtaba 2013-05-10 07:55:49

您没有明确定义任何赋值运算符,因此编译器将为每个结构生成它自己的默认运算符。编译器的默认赋值运算符bb作为输入,并将分配这两个成员。使用继承时,赋值运算符不会自动继承。这就是为什么你无法将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; 
} 
+1

如果我处理这样的任务可以吗? [链接](http://ideone.com/NZBtVG) – 2013-05-10 08:16:31

不,因为即使这些类是相关的,它们也是不同的类型。

想想这个,即使它被允许并且它可以像你期望的那样工作,那么y.j的值在分配之后会是什么?

+0

我希望它未经修改。我认为只有从a派生出来的b的部分被分配给了。 – 2013-05-10 07:54:25

由于错误状态,您需要实现赋值运算符。也就是说,一个函数告诉程序如何将一个对象分配给另一个对象。如果您在网上搜索,您可以找到大量的信息。 on http://www.cplusplus.com/articles/y8hv0pDG/