> 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-а. а потом раслабиться ;-)))
никто тут никого не обвиняет. речь идет скорее о разработчиках компиляторов.
удачи.
З.Ы. обажаю С++ за его гибкость .
|