正在创建<;派生类>;以存储<;基类>;对象

本文关键字:gt lt 存储 对象 基类 派生 创建 | 更新日期: 2023-09-27 18:26:49

当您创建派生类类型的变量来存储基类对象的变量时,我对这个例子的实际使用有一个问题。

DerivedClass C = new BaseClass(); 

在什么情况下我可以用这个。

正在创建<;派生类>;以存储<;基类>;对象

在什么情况下我可以用这个。

你不能。曾经

静态类型的要点是,您可以依赖于与您声明的类型兼容的变量的值。因此,如果您将变量声明为:

DerivedClass C;

则CCD_ 1的任何值必须能够被视为CCD_。特别是,DerivedClass的所有成员都必须可用。如果该值实际上是对BaseClass实例的引用,而该实例并不具有所有这些成员,那么情况就不是这样了。

幸运的是,语言规则(因此编译器)明白这将是一件非常糟糕的事情,因此您将得到一个编译时错误。

如果您试图将基类的实例强制转换为派生类的实例,则必须确保第一个实例实际上是使用if (obj is DerivedClass) newInstance = (DerivedClass) obj的派生类型。

如果你需要一个upcast,你必须实现一种复制方法,使用反射将所有成员从你的基类复制到你的派生类。例如,在这种情况下,你必须为DerivedClass的每个成员设置某种默认值,而这些成员不是BaseClass的一部分。但这更像是一次黑客攻击,可能会带来一些危险,因为你可能会创建一些腐败的实例。