【问题标题】:Assign to base class part of the object only仅分配给对象的基类部分
【发布时间】:2013-05-05 06:37:58
【问题描述】:

当D类派生自B类时,如何只分配给它的B部分?

在 C++ 中,我会这样做:

D d;
B b;
d.B::operator = (b);

什么是 C# 等价物?

【问题讨论】:

  • 你的意思是base关键字吗?

标签: c# inheritance assignment-operator


【解决方案1】:

在 C# 中没有切片的等价物。您需要手动创建基类的实例并复制相关属性。如果基类有一个非虚拟克隆方法(或复制构造函数),那么你可以使用它,但你不能像在 C++ 中那样使用切片。

【讨论】:

    【解决方案2】:

    如果

    class B {}
    class D : B {}
    

    那么D 本质上是一个具有附加功能的B。它没有“部分”是B,它一个B

    因此,这不可能以您尝试做的直接方式进行。您必须自己在D 中实现一个函数,例如void Merge(B b),它将B 中的字段分配给对象的(D)相关base 字段。

    【讨论】:

    • 我想我必须学习 C# 中的对象分配有很大不同 - 它总是分配对对象的引用,而不是对象内容。
    • @Suma 这只是类的情况,而不是结构。在值类型(包括用户定义的结构)的情况下,变量代表对象本身的值,就像它们在 C++ 中所做的那样。不同之处在于,在 C# 中,结构不能继承自一种通用基类型以外的任何东西,这就是 C# 禁止切片的原因。
    【解决方案3】:

    虽然问题是针对 C#,但这里有两种针对 C++ 的可能性,因为那里也可能出现问题: 任何一个 static_cast<B&>(d) = b; 或没有演员表

    B & b_of_d = d;
    b_of_d = b;
    

    另见this answer

    【讨论】:

    • 这个答案适用于 C++。这个问题是关于 C# 的。
    • Ups,我错过了。我不会在答案中使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2018-02-02
    • 2021-03-03
    • 2021-01-05
    • 2015-11-07
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多