将派生类转换为彼此

时间:2017-04-27 19:33:45

标签: c# inheritance

据我所知,不允许将一个派生类强制转换为另一个派生类,因此假设ClassBClassC派生自同一ClassA,这将不起作用:

ClassB b = new ClassB();

ClassC c = new ClassC();

c = b;

但是下面的代码可以解释为什么:

ClassA b = new ClassB();

ClassA c = new ClassC();

c = b;

有人能详细解释这里发生了什么吗?

2 个答案:

答案 0 :(得分:2)

我将通过以下方式更改您的类型,看看它是否能让情况更加清晰:

ClassA --> Animal
ClassB --> Tiger
ClassC --> Giraffe

在这个例子中:

Tiger b = new Tiger();

Giraffe c = new Giraffe();

c = b;

c变量必须引用类型为Giraffe的实例。尝试为Tiger分配引用无效,因为Tiger不是Giraffe

你的下一个例子:

Animal b = new Tiger();

Animal c = new Giraffe();

c = b;

有效是因为GiraffeTiger都是Animal,所以引用TigerGiraffe完全没问题来自必须引用Animal

的变量

请注意,此代码的NONE不会更改创建的对象的实际类型。 cb只是对象的引用。当你说

c = b;

您正在做的就是更改c 引用的对象 - 它现在引用b所做的同一对象。 c 使用指向的对象现在是孤立的(在任何地方都没有引用它)。

如果你那么

b.Name = "Sam";

您会看到该更改通过b引用和c引用反映出来。

答案 1 :(得分:0)

如果你设置这样的类:

class ClassA
{
    public int a;
}

class ClassB : ClassA
{
    public string b;
}

然后你可以这样做:

ClassA B = new ClassB();
B.a = 1;

但不是这样:

B.b = "b";

编译器抱怨ClassA不包含'b'的定义。换句话说,它只将B视为ClassA。这就是你可以从C转换为B的原因。