【问题标题】:Assign derived class to base class将派生类分配给基类
【发布时间】:2011-04-14 04:09:42
【问题描述】:

执行以下操作是否安全还是未定义的行为:

class Base
{
private:
    int a;
};

class Derived : public Base
{
private:
    int b;
};

Base x;
Derived y;
x = y;   // safe?

派生类中的多余位会被切掉吗?

【问题讨论】:

  • 这里没有任何东西被“切掉”:y 仍然是 Derived 类型的完全有效对象。但只有y 的那些部分被分配给x,适合x。这又不是问题。如果您稍后假设x 不是Base 类型,而是Derived 类型,那么它只会成为一个问题。

标签: c++ class inheritance variable-assignment


【解决方案1】:

是的,会发生切片。不过,这不是未定义的行为。

您可能会发现 C++-FAQ 中的此条目很有帮助:
http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8

【讨论】:

    【解决方案2】:

    你是对的,对象被切片了。这是common 问题。你不应该这样做!

    【讨论】:

    • 这不是“问题”,它是一种语言特性,非常有用。例如,如果您有仅数据结构,其中指定了一些值并且必须计算其他值,那么您可以将计算值放在派生类中。
    • @ShitalShah 大多数人很难找到这个功能,但我同意它很有用。我的问题是,如果您要使用它,您将如何让代码的读者明白这是您的意图?我总是认为这是一个错误,除非有评论说“故意切片对象”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2021-09-09
    • 1970-01-01
    相关资源
    最近更新 更多