0

我对分配派生类的基对象感到困惑。假设我有一个类型:

class Base {
 // stuff omitted for brevity
}

和一个派生类

Derived : public Base {
  // stuff omitted
}

我有这样的情况:

Derived = Base;

这可能吗?这个操作叫什么?我怎么会做这样的事情?

谢谢你的帮助。

4

3 回答 3

1

这是一个非常普通的用户定义赋值,看起来很像“切片”,将基类视为成员,以使粗心的人感到困惑。但它不是切片。对于您的情况,这两个类也可能不相关,并且您以这种方式定义分配。

struct d : b {
     d &operator=(const b &b_) { /*do the work here*/; return *this; }
};

您可能能够使用基类的复制赋值运算符,或者您可能不会:

struct dx : b {
    dx &operator=(const b &b_)
    {
        this->b::operator=(b_);
        // more work
        return *this;
    }
};

但是编译器没有对此进行特殊处理,它与任何函数调用相同。

于 2013-08-16T02:16:23.250 回答
0

您几乎不应该将基类对象分配给派生类对象,因为这样派生对象仅被部分分配,这可能不一致。但有时您可能需要将基类对象的指针转换为派生类对象的指针

Base *pb = new Derived;
..
Derived *pd = dynamic_cast<Derived*>(pb);

当您想要识别基指针指向的对象的确切类型时使用此方法(但实际上指向驱动对象,如本例所示)。通常你应该避免这样做,因为它很耗时,而且不是一个好的设计。

于 2013-08-16T01:29:29.533 回答
0

这被称为object slicing,它通常是一件坏事。派生类是具有更多内容的基类。因此,当您将 Derived 对象分配给 Base 对象时,多余的东西会发生什么?该操作没有逻辑意义。

于 2013-08-16T01:45:31.977 回答