Да , было бы. А почему бы и нет?
Потому что child на самом деле является экземпляром Parent. Если вы хотите выполнить операцию только для ребенка, отметьте
if (child instanceof Child){
}
Однако вы должны помнить следующее высказывание Скотта Мейерса из Effective C ++:
"Каждый раз, когда вы пишете
код формы "если объект имеет
введите T1, затем сделайте что-нибудь, но если
это типа T2, тогда сделай что-нибудь
иначе "пощечина.
что, я думаю, применимо и в этом случае. Если вы хотите doSomething в зависимости от того, к какому типу класса относится объект, на который ссылаются, вам поможет следующая структура кода.
ПРИМЕЧАНИЕ: Я не скомпилировал его.
class Parent {
public void doSomething() {
System.out.println("I am the Parent, and I do as I like");
}
}
class ChildA extends Parent {
public void doSomething() {
System.out.println("I am a child named A, but I have my own ways, different from Parent");
}
}
class ChildB extends Parent {
public void doSomething() {
System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
}
}
public class Polymorphism101 {
public static void main(String[] args) {
Parent p = new Parent();
p.doSomething();
p = new ChildA();
p.doSomething();
p = new ChildB();
p.doSomething();
}
}
РЕДАКТИРОВАТЬ: лучший пример
Возможно, вы разрабатываете приложение для рисования . Приложение, которое рисует фигуры любого вида. В этом случае у вас должен быть abstract type Shape
.
Для целей, подобных; рисование всех форм; перечислите все формы; чтобы найти фигуру или удалить фигуру, вам нужно иметь список фигур. Поскольку список имеет родительский тип, он может хранить любые фигуры.
Интерфейс Shape
/ абстрактный класс / виртуальный класс должен иметь abstract / pure virtual функцию Draw()
. Итак, в вашем DrawToDeviceLoop вы просто вызываете Draw()
для каждой фигуры, вам никогда не нужно проверять, какая она фигура.
Интерфейс Shape
может иметь абстрактную реализацию AbstractShape
, которая может иметь имя или идентификатор фигуры в качестве членов данных и GetName, Cleanup и другие функции с функциями, общими для всех фигур.
Помните, что абстрактный тип не может быть создан , поэтому сам Shape
не может быть создан, так как он также не может быть нарисован.