我有这个继承:
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!
我能知道为什么吗?以及解决这种情况的任何简单方法吗?
谢谢!
答案 0 :(得分:1)
a = c;
因此,编译器会从c
复制基础部分。但它会为派生类特定的部分设置什么。当编译器感到困惑时,它就会呕吐。
答案 1 :(得分:1)
来自Liskov的替代原则:
子类应至少与基类一样多。
当继承发生时,派生clas知道所有函数和变量(是的,有些是公共的,有些是私有的,有些是受保护的,但它们是已知的)。
虽然基类不知道派生类。
例如,青蛙是一种动物,但动物需要一只青蛙。
简而言之,此属性使其抛出编译错误
"派生类型必须完全可替代其基本类型。" - http://www.oodesign.com/liskov-s-substitution-principle.html
这表示 c = a 有效。