2015-05-24 3 views
2

Пока я знаю, мы не можем напрямую преобразовать базовый класс в производный (под) класс, потому что база не является экземпляром производного и, следовательно, ll приведет к null.Преобразование базового класса в производный класс не приводит к нулю

У меня есть два класса, один происходит от другого. Я пытаюсь понять, почему я могу преобразовать baseClass1 в Sub, не приводя к нулю, пока я не могу преобразовать baseClass2 в Sub, потому что он приводит к null.

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 является экземпляром базы, даже если я использовал Sub() конструктор. Но использование конструктора Sub() каким-то образом позволяет мне преобразовать экземпляр Base в экземпляр Sub, даже не потеряв значения, которые содержат дополнительные члены класса Sub (скажем, я передал эти значения через конструктор Sub() в первом линия).

Какова логика этого? Какова истинная разница между baseClass1 и baseClass2, хотя они оба являются экземплярами Base?

+0

Вы можете _treat_ ссылаться на _Sub_ как ссылку на _Base_, но это не значит, что базовый тип (фактический тип) изменится. – chomba

+0

Второе приведение должно приводить к недействительности InvalidCastException. –

ответ

2

baseClass1 является экземпляром Base, хотя я использовал конструктор Sub().

Это совершенно неправда. baseClass1 - это экземпляр Sub, присвоенный переменной, напечатанной как Base. Вот почему вы можете вернуть его обратно в Sub.

1

Это потому, что baseClass1 действительно ссылается на экземпляр Sub. Вы не можете передать экземпляр базового класса в класс производного класса. Вот почему второй листок терпит неудачу.

object o = new object(); 
string s = (string) o; 
int i = s.Length; // What can this sensibly do? 

Ref: https://stackoverflow.com/a/729532

1

Это не имеет значения, какой тип вы объявляете baseClass1 быть, это то, что фактический экземпляр его указывает, что очень важно, поэтому, даже если вы ввели его в качестве базы распределенный тип на куче фактически является Суб ... Следовательно, отлитие от Sub является прекрасным

Смежные вопросы