不允许将结构实例分配给类实例[重复]

Posted

技术标签:

【中文标题】不允许将结构实例分配给类实例[重复]【英文标题】:Assigning a structure instance to a class instance not allowed [duplicate] 【发布时间】:2015-01-06 15:37:00 【问题描述】:

我有这个继承:

class SomeClass : public s_SomeStruct ; // where s_SomeStruct is a classic C struct.

还有这些声明:

SomeClass a;
SomeClass b;
s_SomeStruct c;

我不知道为什么情况(2)不起作用:

a = b; // (1) works fine
a = c; // (2) DOESN't WORK! 
c = a; // (3) Oh? It works!

我能知道为什么吗?有什么简单的方法可以治愈这种情况吗?

谢谢!

【问题讨论】:

SomeClass 是一种更具体的类型。在进行赋值时,编译器无法推断出如何处理不在s_SomeStruct 中的成员。 在不知道您要解决的真正问题的情况下,我们无法就如何使其满足您的需求提出不可猜测的建议。 【参考方案1】:

来自 Liskov 替换原理:

子类至少应该和基类一样多。

说明:

发生继承时,派生类知道所有函数和变量(是的,有些是公共的,有些是私有的,有些是受保护的,但它们是已知的)。

虽然基类不知道派生类。

例如,青蛙是动物,但动物不一定是青蛙。

简而言之,这个属性使它抛出编译错误

参考:

“派生类型必须完全可以替代它们的基类型。” - http://www.oodesign.com/liskov-s-substitution-principle.html

这表示 c=a 有效。

【讨论】:

很好的答案,不仅给出了正确的解释,而且还提供了宝贵的背景知识和原则【参考方案2】:
a = c;

因此,编译器将从c 复制基本部分。但是它将为特定于派生类的部分设置什么。当编译器感到困惑时,它只会呕吐。

【讨论】:

以上是关于不允许将结构实例分配给类实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个不允许重复实例的类(在可能的情况下返回现有实例)?

静态扩展方法[重复]

将 self 与实例一起用于分配和释放 [重复]

不允许定义一个类的多个实例[重复]

此集合实例上不存在属性 [名称] [重复]

.map函数内的子组件显示所有子实例[重复]