-1

我有一个关于基类与其子类之间转换的问题:

(1) 为什么允许这样做?

BaseClass b = new ChildClassA();
ChildClassA c = (ChildClassA)b

(2) 为什么不允许这样做?

ChildClassA c = (ChildClassA)new BaseClass();
BaseClass b = (BaseClass)c;

(3) 为什么允许这样做?

BaseClass b = new BaseClass();
ChildClassA c = (ChildClassA)c;

(4) 为什么允许这样做?

ChildClassA c = new ChildClassA();
BaseClass b = (BaseClass)c;
4

6 回答 6

4

允许或不允许强制转换的原因是继承背后的基础。

子类(或派生类)始终是基类,但反之则不然。

为了解释,让我们为您的示例类使用一些更真实的世界名称:

class Animal
{
}

class Dog : Animal
{
}

class Cat : Animal
{
}

因此,对于您的示例(1):

Animal b = new Dog();
Dog c = (Dog)b

这是真的,因为所有的 Dogs 都是 Animals 而你的 Animal b 实际上是一只狗,所以演员表是成功的。

对于您的示例(2):

Dog c = (Dog)new Animal();
Animal b = (Animal)c;

这是不可能的,因为您将 Animal 对象分配给 Dog,但您知道并非所有动物都是 Dogs,有些动物是猫。

例如(3)和(4):

Dog c = new Dog();
Animal b = (Animal)c;

这与您上面的示例 1 相同。所有的狗都是动物,所以任何狗都可以归类为动物并进行演员表(实际上你不需要演员表,会有一个隐式演员表,你可以把它写成Animal b = c;

于 2013-05-31T13:32:48.097 回答
1

(1) 为什么允许这样做?BaseClass b = new ChildClassA(); ChildClassA c = (ChildClassA)b

因为 ChildClassA 是 BaseClass。

(2) 为什么不允许这样做?ChildClassA c = (ChildClassA)new BaseClass(); 基类 b = (基类)c;

因为 BaseClass 不是 ChildClassA

(3) 为什么允许这样做?ChildClassA c = new ChildClassA(); 基类 b = (基类)c;

因为 ChildClassA 是 BaseClass。

(4) 为什么允许这样做?ChildClassA c = new ChildClassA(); 基类 b = (基类)c;

同问题 3。

创建继承类时,可以将该类强制转换为基类的实例,因为它是该类的子类。但是,当您尝试使用基类对象创建子类时,基类并不具有子类的所有信息。

孩子知道他的父母怎么样,但父母不知道孩子有什么。

于 2013-05-31T13:25:46.523 回答
1

用“是一个”来思考。ChildClassA我们可以说“是”的任何实例BaseClasswhere class ChildClassA : BaseClass。但反之亦然。在这种情况下,我们不能说BaseClass“是”的任何实例ChildClassA

现在尝试如下阅读您的代码行。我相信这一次会更有意义。

new ChildClassA()ChildClassAthen 它也是 "is a"的一个实例BaseClass。所以我们可以分配 new ChildClassA()哪个b是类型BaseClass

我们可以b转换为,ChildClassA因为它实际上(指向)一个ChildClassA.

我们不能new BaseClass()转换为,ChildClassA因为BaseClass“不是”的实例ChildClassA

于 2013-05-31T13:27:22.743 回答
0

好...

(2) 是不允许的,因为您不能将 a 强制BaseClass转换为 a ChildClassA- 的实例ChildClassA也是通过继承 aBaseClass而不是相反!

于 2013-05-31T13:25:37.393 回答
0
  1. 是允许的,因为 b 确实是 ChildClassA
  2. 不允许,因为您不能将基类转换为子类,因为基类不包含子类工作所需的定义
  3. 是允许的,因为 ChildClass 包含 BaseClass 的所有定义,并且 ChildClass IS A BaseClass 4.same as 3?
于 2013-05-31T13:25:41.580 回答
0

一般来说,这是因为 ChildClassA 可能已经定义了 BaseClass 不知道的东西,而由于 ChildClassA 派生自 BaseClass,它知道关于它的一切。

于 2013-05-31T13:25:55.480 回答