不允许将结构实例分配给类实例[重复]
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
复制基本部分。但是它将为特定于派生类的部分设置什么。当编译器感到困惑时,它只会呕吐。
【讨论】:
以上是关于不允许将结构实例分配给类实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章