只要我知道,我们就不能直接将基类转换为派生(子)类,因为基类不是派生的实例,因此它会导致null。 / p>
我有两个类,一个来自另一个。我试图找出为什么我可以将 baseClass1 转换为Sub而不会导致null,而我无法将 baseClass2 转换为Sub,因为它会导致空。
Base baseClass1 = new Sub(); // The result is an instance of Base
Base baseClass2 = new Base(); // Same thing
Sub subClass1 = (Sub)baseClass1; // Doesn't result in null
Sub subClass2 = (Sub)baseClass2; // Does result in null
baseClass1 是Base的一个实例,即使我使用了Sub()构造函数。但是使用Sub()构造函数以某种方式允许我将Base的实例转换为Sub的实例,甚至不会丢失Sub类的额外成员所持有的值(让我们说我通过Sub()传递了这些值第一行中的构造函数。)
这背后的逻辑是什么? baseClass1和baseClass2之间的真正区别是什么,即使它们都是Base的实例?
答案 0 :(得分:2)
baseClass1是Base的一个实例,即使我使用了Sub()构造函数。
这完全不正确。 baseClass1
是Sub
分配给Base
的变量的实例。这就是您可以将其强制转换回Sub
的原因。
答案 1 :(得分:1)
这是因为baseClass1
实际上引用了Sub
的实例。您不能将基类的实例强制转换为派生类的实例。这就是第二次演员失败的原因。
object o = new object(); string s = (string) o; int i = s.Length; // What can this sensibly do?
答案 2 :(得分:1)
你声明baseClass1的类型并不重要,它指向的实际实例很重要,因此即使你输入它作为Base,堆上的分配类型实际上是Sub ...因此施放到Sub很好