【问题标题】: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 中的成员。
  • 在不知道您要解决的真正问题的情况下,我们无法就如何使其满足您的需求提出不可猜测的建议。

标签: c++ class struct


【解决方案1】:

来自 Liskov 替换原理:

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

说明:

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

虽然基类不知道派生类。

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

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

参考:

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

这表示 c=a 有效。

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2019-02-23
    • 2015-04-02
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多