仅分配给对象的基类部分
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,我错过了。我不会在答案中使用它。以上是关于仅分配给对象的基类部分的主要内容,如果未能解决你的问题,请参考以下文章