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

时间:2013-05-10 07:50:11

标签: c++ class inheritance

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

3 个答案:

答案 0 :(得分:1)

您没有明确定义任何赋值运算符,因此编译器将为每个结构生成自己的默认运算符。 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;
}

答案 1 :(得分:0)

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

考虑一下,即使它被允许并且它会像您预期的那样工作,y.j在作业之后的价值是什么?

答案 2 :(得分:0)

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