2011-07-20 2 views
2
class Base 
{ 

} 

class Derive:Base 
{ 

} 

Base b=new Derive(); 

Приведенный выше код работает, но почему мы можем создать объект класса Derive и присвоить его базовому классу. Кроме того, переменная объекта «b» сможет получить доступ ко всем не закрытым переменным и методам Base Base, даже если она ссылается на Derive Class. Что делает это возможным, почему объектная переменная 'b', которая ссылается на Derive Object, имеет доступ к базовому классу, а не к классу Derive.Основы наследования

+0

Я не думаю, что код будет работать, они даже не компилируются. – pierrotlefou

ответ

3

Теория, позволяющая использовать вышеприведенный код, называется substitution principle: Когда Derived является подтипом Base, это формирует отношения «is-a». Принцип подстановки постулирует, что везде, где ожидается экземпляр Base, он может быть заменен экземпляром Derived.

Причина вы не можете получить доступ к свойствам и методам Derive класса позже в том, что (по крайней мере, к компьютеру) нет никаких признаков вообще, что переменная типа Base содержит экземпляр типа Derive, который позволил бы доступ к эти свойства/методы. Если вы возьмете другой класс DerivedToo : Base, который имеет другие методы, чем Derive, вы быстро увидите, как программа может сломаться, если вы приняли переменную Base для хранения экземпляра Derive.

1

Я думаю, что это вопрос полиморфизма, а не наследование.

Одной из основных особенностей производных классов является то, что указатель на производный класс совместим с типом с указателем на его базовый класс. Используя полиморфизм, вы можете воспользоваться этой функцией.

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