Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Порядок конструирования и разрушения объектов

Представление интерфейса в памяти | Применение интерфейса для доступа к объекту динамически-подключаемой библиотеки | Понятие компонента | Понятие визуального программирования | Microsoft Visual Studio | Желательно встроить средства расширения в язык. | Всегда есть потеря на jmp; | Component Pascal | Предкомпилированные заголовки | Понятие пространства имен |


Читайте также:
  1. I. Порядок проведения соревнований
  2. I. Порядок проведения соревнований
  3. II. Порядок выплаты ежемесячной компенсации на оплату проезда до места проведения процедуры гемодиализа инвалидам, находящимся на постоянном диализном лечении.
  4. II. Порядок выплаты пенсии
  5. II. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
  6. II. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ.
  7. II. Порядок и условия проведения

 

По причине автоматичности конструкторов и деструкторов в С++ существует определенный порядок конструирования базовых и агрегированных объектов.

 

class TTextReader

{

public:

TTextReader();

~TTextReader();

}

 

class TDelimitedReader: public TTextReader

{

public:

TDelimitedReader();

~TDelimitedReader();

}

 

TDelimitedReader::TDelimitedReader()

{

...

}

TDelimitedReader::~TDelimitedReader()

{

...

}

 

В конструкторе производного класса конструктор базового класса вызывается автоматически до выполнения первого оператора в теле конструктора.

 

В деструкторе производного класса деструктор базового класса вызывается автоматически после последнего оператора в теле деструктора.

 

Если базовый класс содержит конструктор с параметрами или несколько конструкторов, то возникает неопределенность в том, какой конструктор базового класса будет вызван. Эту неопределенность можно устранить следующим образом:

TDelimitedReader::TDelimitedReader(): TTextReader(...)

// в скобках записываются параметры для вызова конструктора

{

...

}

 

После двоеточия разрешена запись списка операторов, разделенных запятыми. Эти операторы называются списком инициализации.

 

В С++ поддерживается множественное наследование. В этом случае конструктор базовых классов вызывается автоматически в порядке их упоминания в описании класса. Деструктор же базовых классов вызывается строго в обратном порядке.

 

Каждый конструктор перед началом своей работы инициализирует указатель vtable (в Delphi он называется VMT). Конструктор базового класса тоже инициализирует этот указатель. В результате этого объект как бы "рождается", сначала становясь экземпляром базового класса, а затем производного. Деструкторы выполняют противоположную операцию.

 

В результате этого в конструкторах и деструкторах виртуальные методы работают как невиртуальные.

 

Каждый конструктор перед началом своей работы укладывает в объекте ссылку на таблицу виртуальных методов – перед началом работы конструктора, т.е. самый базовый класс вкладывает в объект ссылку на таблицу виртуальных методов.

В других языках ­ ­– первый вызванный конструктор укладывает ссылку на таблицу виртуальных методов. Следовательно, при вызове виртуального метода будет вызван метод производного класса.

По стандарту деструкторы и delete не имеют права бросать исключения.

 


Дата добавления: 2015-11-16; просмотров: 127 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Стандартные конструкторы| Множественное наследование

mybiblioteka.su - 2015-2024 год. (0.006 сек.)