我对分配派生类的基对象感到困惑。假设我有一个类型:
class Base {
// stuff omitted for brevity
}
和一个派生类
Derived : public Base {
// stuff omitted
}
我有这样的情况:
Derived = Base;
这可能吗?这个操作叫什么?我怎么会做这样的事情?
谢谢你的帮助。
我对分配派生类的基对象感到困惑。假设我有一个类型:
class Base {
// stuff omitted for brevity
}
和一个派生类
Derived : public Base {
// stuff omitted
}
我有这样的情况:
Derived = Base;
这可能吗?这个操作叫什么?我怎么会做这样的事情?
谢谢你的帮助。
这是一个非常普通的用户定义赋值,看起来很像“切片”,将基类视为成员,以使粗心的人感到困惑。但它不是切片。对于您的情况,这两个类也可能不相关,并且您以这种方式定义分配。
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;
}
};
但是编译器没有对此进行特殊处理,它与任何函数调用相同。
您几乎不应该将基类对象分配给派生类对象,因为这样派生对象仅被部分分配,这可能不一致。但有时您可能需要将基类对象的指针转换为派生类对象的指针
Base *pb = new Derived;
..
Derived *pd = dynamic_cast<Derived*>(pb);
当您想要识别基指针指向的对象的确切类型时使用此方法(但实际上指向驱动对象,如本例所示)。通常你应该避免这样做,因为它很耗时,而且不是一个好的设计。
这被称为object slicing
,它通常是一件坏事。派生类是具有更多内容的基类。因此,当您将 Derived 对象分配给 Base 对象时,多余的东西会发生什么?该操作没有逻辑意义。