2016-06-04 2 views
-1

У меня вопрос о полиморфных назначениях. Давайте предположим, что это заявление:Полиморфизм: источник и цель несовместимы

CAR car; 
MERCEDES mercedes; 
//MERCEDES inherits from CAR 

car = new MERCEDES(classA); 
mercedes = car 

ли последнее назначение возможно? Я думал, что первое задание изменяет тип автомобиль на MERCEDES, и поэтому последнее назначение было бы правильным. Но на листах я показываю, что он не компилируется, потому что источник назначения и цель несовместимы. Правильно ли это? И почему это так?

+0

'car = new MERCEDES (...)' не изменяет * тип * переменной 'car'; это все еще «АВТОМОБИЛЬ». Назначение действительно, потому что 'MERCEDES' ** является **' CAR', но это не меняет того факта, что 'car' не гарантируется какой-либо конкретный подкласс CAR. – jonrsharpe

+0

Это означает, что статический тип остается CAR в то время как динамический тип MERCEDES – DevX10

ответ

0

Ваши листы правы, потому что CAR необязательно является MERCEDES. В вашем случае это справедливо, но подумайте об общем случае.

Может быть много типов автомобилей, и компилятор не может гарантировать, что выражение присваивания истинно вообще.

+0

Ah okkey! Но первое задание изменяет тип автомобиля в MERCEDES, это правильно? – DevX10

+0

@ Ergo все Mercedes - это автомобили, но не все автомобили - это Mercedes. – jonrsharpe

+0

Да, я добрался до него, это было больше похоже на общий вопрос, который я сделал сейчас. Но теперь ясно, спасибо – DevX10

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