我对分配派生类的基础对象感到困惑。说我有一个类型:
class Base {
// stuff omitted for brevity
}
和派生类
Derived : public Base {
// stuff omitted
}
我的情况就是这样:
Derived = Base;
这可能吗?这个操作叫什么?我怎么做这样的事情?
感谢您的帮助。
答案 0 :(得分: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;
}
};
但编译器没有给出特殊处理,它与任何函数调用相同。
答案 1 :(得分:0)
您几乎不应该将基类对象分配给派生类对象,因为派生对象只是部分分配,可能不一致。但有时您可能需要将基类对象的指针强制转换为派生类对象的指针
Base *pb = new Derived;
..
Derived *pd = dynamic_cast<Derived*>(pb);
当您想要识别基指针所指向的对象的确切类型(但实际上指向被驱动的对象时,如此示例中),则使用此选项。通常你应该避免这种情况,因为它耗时,并且它不是一个好的设计。
答案 2 :(得分:0)
这称为object slicing
,这通常是一件坏事。 Derived类是一个包含更多内容的Base类。因此,当您将Derived对象分配给Base对象时,额外的东西会发生什么?该操作没有逻辑意义。