仅分配给对象的基类部分

Posted

技术标签:

【中文标题】仅分配给对象的基类部分【英文标题】: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关键字吗? 【参考方案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,我错过了。我不会在答案中使用它。

以上是关于仅分配给对象的基类部分的主要内容,如果未能解决你的问题,请参考以下文章

当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?

这个设计模式有名字吗? (具有仅调用构造函数的实现的基类)

在基类类型的向量中保存的基对象和派生对象被切片

protectedpublicprivate

在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

使用Boost将派生类部分反序列化为基类时输入流错误