В Полиморфизме только производный класс может быть базовым классом, что здесь происходит? - PullRequest
4 голосов
/ 18 октября 2011

В Полиморфизме я узнал, что только производный класс может быть базовым классом, но посмотрите на мой пример, базовый класс теперь является производным классом:

static void Main()
{
   Person a = new Customer();

   //here a base class is a derived class
   Customer c = (Customer)a;
}

class Person
{
}

class Customer : Person
{
}

Почему это возможно?

Члены производного класса не должны отбрасываться при создании экземпляра в базовом классе?

Если я создаю экземпляр производного класса в базовом классе, выделенный объем памяти равен размеру производного класса?

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Поскольку объект на самом деле является клиентом, он будет работать нормально.Позвольте мне быть более конкретным:
a - это «переменная» типа Person, она может содержать «объект» любого типа от Person до любого из его дочерних классов.
c - это «переменная» типа Clientи может содержать «объект» любого типа от клиента до любого из его дочерних классов.

То, что вы сделали, это поместили «объект» Клиента в «переменную» Персона.Куда бы вы ни переместили этот объект, он всегда будет объектом клиента.Итак, нам нужно иметь в виду, что даже если вы помещаете «объект» Client в «переменную» типа Person, тип объекта все еще остается клиентским.В следующем операторе вы просто переместили объект в его правильный тип.

Переменная похожа на корзину.Он может содержать все, что меньше его.Если вы достанете объект из корзины и поместите его в другую корзину, объект останется прежним.

0 голосов
/ 18 октября 2011

Хотя вышеприведенное работает (как отмечено в других ответах), следующее может завершиться неудачей, что, вероятно, является причиной того, что мы не пытаемся привести базовый класс к производному классу (если вы не знаете тип во время выполнения).

static void Main() 
{ 
   Person a = new Customer(); 

   //This will fail at runtime.
   Programmer c = (Programmer)a; 
} 

class Person 
{ 
} 

class Customer : Person 
{ 
} 

class Programmer: Person 
{ 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...