информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медСтрашный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Линуксовый ботнет, распространяющийся... 
 Конец поддержки Internet Explorer 
 Рекордное число уязвимостей в 2021 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Вообще то vtable и vbase указатели устанавливаются *после* выполнения конструктора 29.07.05 13:35  Число просмотров: 1445
Автор: 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 *), ну и так далее.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach