我对如何给派生类的基类赋值感到困惑。假设我有一个类型:
class Base { // stuff omitted for brevity }
和一个派生类
Derived : public Base { // stuff omitted }
and I have a situation情况that rises出现like this:
Derived = Base;
这可能吗?这个手术叫什么我怎么会做这种事谢谢你的帮助
ecfdbz9o1#
这是一个非常普通的用户定义赋值,看起来很像“切片”,把基类当作成员来对待,让粗心的人感到困惑。但这不是切片。对于您所处的情况,这两个类也可能不相关,您可以通过这种方式定义赋值。
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; } };
但编译器对此没有特殊处理,它和任何函数调用一样。
wvyml7n52#
你几乎不应该将基类对象赋值给派生类对象,因为这样派生对象只被部分赋值,这可能是不一致的。但是有时候可能需要将基类对象的指针强制转换为派生类对象的指针
Base *pb = new Derived; .. Derived *pd = dynamic_cast<Derived*>(pb);
当你想标识一个基指针指向的对象的确切类型时(但实际上指向被驱动的对象,就像这个例子中一样),就可以使用这个方法。通常你应该避免这样做,因为这很耗时,而且不是一个好的设计。
kdfy810k3#
这被称为object slicing,通常是一件坏事。一个派生类是一个有更多东西的基类。那么,当你将一个Derived对象赋值给一个Base对象时,多余的东西应该怎么处理呢?这个行动不合逻辑
object slicing
djp7away4#
假设类Base首先有一个复制赋值操作符,您希望调用从Derived类型的对象d获得的“对Base的可修改引用”的方法。通常情况下,当d在需要这样一个基引用的上下文中使用时,编译器会很乐意(并且默默地)提供所需的向上转换(例如,作为一个函数的参数),但这里没有这样的上下文。因此,使用static_cast提供这样的上下文就足够了:
Base
Derived
d
static_cast
static_cast<Base&>(d) = b;
就能完成任务
4条答案
按热度按时间ecfdbz9o1#
这是一个非常普通的用户定义赋值,看起来很像“切片”,把基类当作成员来对待,让粗心的人感到困惑。但这不是切片。对于您所处的情况,这两个类也可能不相关,您可以通过这种方式定义赋值。
你可以使用基类的复制赋值操作符,也可以不使用:
但编译器对此没有特殊处理,它和任何函数调用一样。
wvyml7n52#
你几乎不应该将基类对象赋值给派生类对象,因为这样派生对象只被部分赋值,这可能是不一致的。但是有时候可能需要将基类对象的指针强制转换为派生类对象的指针
当你想标识一个基指针指向的对象的确切类型时(但实际上指向被驱动的对象,就像这个例子中一样),就可以使用这个方法。通常你应该避免这样做,因为这很耗时,而且不是一个好的设计。
kdfy810k3#
这被称为
object slicing
,通常是一件坏事。一个派生类是一个有更多东西的基类。那么,当你将一个Derived对象赋值给一个Base对象时,多余的东西应该怎么处理呢?这个行动不合逻辑djp7away4#
假设类
Base
首先有一个复制赋值操作符,您希望调用从Derived
类型的对象d
获得的“对Base
的可修改引用”的方法。通常情况下,当d
在需要这样一个基引用的上下文中使用时,编译器会很乐意(并且默默地)提供所需的向上转换(例如,作为一个函数的参数),但这里没有这样的上下文。因此,使用static_cast
提供这样的上下文就足够了:就能完成任务