Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Вообще то vtable и vbase указатели устанавливаются *после* выполнения конструктора 29.07.05 13:35 Число просмотров: 1568
Автор: amirul <Serge> Статус: The Elderman
|
> Переменая R обнуляется, как ей и положенно. Тогда как с > функцией ничего страшного не происходит. Никакого access > vialation нет.
Именно поэтому и работает.
Причем после выполнения КАЖДОГО конструктора базового класса. То есть
class Base {
public:
Base();
virtual ~Base();
virtual void f();
};
class Derived: public Base {
public:
Derived();
virtual ~Derived();
virtual void f();
};
class DoubleDerived: public Derived {
public:
DoubleDerived();
~DoubleDerived();
virtual void f();
};
В конструкторе Base-а виртуальные функции недоступны вообще, в конструкторе Derived-а доступны только функции Base-а, так как this по сути является указателем на Base, а Derived только конструируется, ну а в DoubleDerived доступны виртуальные функции Derived-а по той же причине. Причем, когда я говорю о доступности, следует понимать, что вызов f() в конструкторе Base скорее всего не скомпилируется (компилятор отлично все видит), а если его все таки заставить (поиграться с указателями), то это приведет к краху, вызов f() в конструкторе Derived вызовет на самом деле Base::f() (хотя this вроде как имеет тип Derived *), ну и так далее.
|
|
|