информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetПортрет посетителяВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор 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
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
;-) 29.07.01 14:31  Число просмотров: 1267
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> kabanchik, если конструкторы не убеждают, я тебя
> деструктором задавлю :)
самоуверенный типус ;-))) попробуем еще тебе задать пример.

1) Object - programmable area in memory - это в первую очередь. как не крути это есть факт. т.е. дай любую память и я из него сделаю объект. это пример
char* data = new[sizeof(Child)];
Child* pChild = new (data)Child; // вот и создался "живой" объект

2) пошли дальше. в объекте с виртуальной ф-ией, как ты сам заметил, есть vtb. vtbl - физически существует в объекте. пример
class Some
{
public:
    int    m_member;
    virtual void Func() { ;}
};

---
sizeof(Some) == sizeof(int) + sizeof(vtbl) == 4 + 4 == 8;

конструктор инициализирует vtbl !!!

вот тебе еще пример с конструктором и деструктором
class Parrent
{
public:
    Parrent()
    {    Msg();}
    virtual ~Parrent()
    {    Msg();}
public:
    virtual void Msg()
    {    printf("This function called from class Parrent\n");}
};

class Child : public Parrent
{
public:
    Child()
    {    Msg();}
    virtual ~Child()
    {    Msg();}
public:
    virtual void Msg()
    {    printf("This function called from class Child\n");}
};

int main()
{
    Child child;
    return 0;
}

---

Угодай результат? как видешь тут я, как ты вырозился, не насилую. в конструкторе и в деструкторе я ничего не писал. вот тебе пища на размышление - конструктор и деструктор.

3) вот еще:

class Parrent
{
public:
    Parrent()
    {    ;}
    virtual ~Parrent()
    {    ;}
};

class Child : public Parrent
{
public:
    Child()
    {    ;}
    virtual ~Child()
    {    ;}
public:
    virtual void foo()
    {    printf("Function called successful.\n");}
    void Magic()
    {this->~Child(); new(this)Parrent;}
};

int main()
{
    Child child;
    child.foo();
    child.Magic();
    Child* pChild = &child;
    child.foo();
    pChild->foo();

    return 0;
}

---

короче, по моему ты просто отказываешься понимать.
я все время спрашиваю "почему", а ты ответили "что".
то что происходит это и дурак увидет. но это есть баг, либо докажите, что так и должно быть - статьи авторитетов или разработчиков компилятора, а не собственные рассуждения.
если честно я уже утомился, устал забрасывать насилованные и не насилованные примеры. Объект имеет vtbl и он ДОЛЖЕН динамически менятся!!!
баг этот у меня почти 1 год валяется, но не кидал на форум, потому как всегда знал, что появится кто то кто заявит, что - правильно - бегемоты тоже летают.
не обижайся, но у меня ощущение. что ты в виртуальных ф-иях слаб. ты хоть знаешь почему деструктор объявляют виртуальным?

вот тебе еще пример, побалуйся на досуге. лично мне очень нравятся хитрые примеры. такого не в книге прочитаешь. есть вещи - называются опыт

class Parrent
{
public:
    Parrent()
    {    ;}
    virtual ~Parrent()
    {    ;}

public:
    virtual void foo()
    {    ptintf("foo()\n");}
    virtual void foo(int i)
    {    printf("foo(%d)\n", i);}
    virtual void foo(char* szMsg, int i)
    {printf("%s, foo(%d)\n", szMsg, i);}
};

class Child : public Parrent
{
public:
    virtual void foo()
    {    printf("foo() from Child.\n")}
};

int main()
{
    Child child;
    child.foo();
    child.foo(5);
    child.foo("Cheers ", 10);

    return 0;
}

допиши класс Child так, чтобы код заработал, но не добавляя следующие строки :
virtual void foo(int i); и 
virtual void foo(char *szMsg, int i);

---

поверь, я не собираюсь тестировать твои знания. я всего лишь пытаюсь чтобы ты сам выяснил для себя всю мощь виртуальных ф-ий, тогда и увидешь что делает конструктор, а что деструктор.
если не получится, дай знать. могу подсказать, что дело тут всего одной строчки в классе Child.

> MSDN: An explicit call to a destructor where none is
> defined has no effect. Видимо, сие надо понимать так: при
> явном вызове выполняется ТОЛЬКО то что ТЫ САМ написал в
> деструкторе. Да или нет?
и да и нет. кроме того что написано в деструкторе программером, он еще и меняет указатель на таблицу виртуальных ф-ий если такое есть. во всяком случае так должно быть. об этом и идет весь этот разговор!!! попробуй думать не о самоизменяюмщемся или изнасилованном объекте, а о том что твориться с объектом когда он создается и уничтожается и вообще как он живет. плз, еще раз прочти все сообщения. советую прочитать диалог с Gesha-ей. просмотреть еще раз дамп XR-а. а потом раслабиться ;-)))
никто тут никого не обвиняет. речь идет скорее о разработчиках компиляторов.

удачи.

З.Ы. обажаю С++ за его гибкость .
<programming> Поиск 






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


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