Бьерн Страуструп.
Язык программирования С++
151
void g()
{
manager
mm;
employee* pe = &mm;
//
нормально
employee
ee;
manager* pm = ⅇ
//
ошибка:
// не всякий служащий является управляющим
pm->level = 2;
// катастрофа: при размещении ee
// память для члена `level' не выделялась
pm = (manager*) pe;
// нормально: на самом деле pe
// не настроено на объект mm типа manager
pm->level = 2;
// отлично: pm указывает на объект mm
// типа manager, а в нем при размещении
// выделена память для члена `level'
}
Иными словами, если работа с объектом производного класса идет через указатель, то его можно
рассматривать как объект базового класса. Обратное неверно. Отметим, что в обычной реализации С++
не предполагается динамического контроля над тем, чтобы после преобразования типа, подобного
тому, которое использовалось в присваивании pe в pm, получившийся в результате указатель
действительно был настроен на объект требуемого типа (см. $$13.5).
Достарыңызбен бөлісу: