Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++ Bug] Bug report 25.07.01 01:12 Число просмотров: 955
Автор: kabanchik Статус: Незарегистрированный пользователь
|
за синтаксические ошибки сорри, я ночью писал, уже носом в клаву клевал.
> > Попробовал вышло вот что : > > > > ============================= > > > >
> > #define TRACE(x) printf(x)
> >
> > class Parrent
> > {
> > public:
> > Parrent()
> > {m_pParrent = new char[10];} // for fun
> > virtual ~Parrent()
> > {if (m_pParrent != NULL) delete [] m_pParrent;
> > m_pParrent = NULL;}
> > public:
> > virtual void PrintMsg()
> > {
> > TRACE("This function called from class
> > Parrent.\n");
> > }
> >
> > protected:
> > char* m_pParrent;
> > };
> >
> > class Child: public Parrent
> > {
> > public:
> > Child()
> > {m_pChild = new char[30];} // just for fun,
> dummy
>
> ^^^^^^^^^^^^^^^^^^^
> это скорее всего очепятка - добавляем char* m_pChild
^^^^^^^^^^ это совершенно верно заметил
>
> > buffer
> > virtual ~Child()
> > {if (m_pChild != NULL) delete [] m_pChild;
> m_pChild =
> > NULL;}
> >
> > public:
> > virtual void PrintMsg()
> > {
> > TRACE("This function called from class Child.\n");
> > }
> >
> > void Magic()
> > {
> > this->~Child();
> ^^^^^^^^^^^^^^^^^^^^^^^^^
> Вот это КРУТО :)) надо запомнить :)
>
> > new (this) Parrent;
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> А вот на эту конструкцию мой компилер сказал
> test3.cpp: In method `void Child::Magic()':
> <internal>:39: too many arguments to function `void *
> operator new(unsigned int)'
> test3.cpp:39: at this point in file
> для справки
> $g++ -v
> gcc version 2.95.3 20010315 (release)
>
> Я поправил на new(*this) Parrent
>
> Это была фича или очепятка ?
^^^^^^^^^^^^^^^^^^
Все ОК! тока надо было #include <new.h> - забыл предупредить, хотя странно - результат у тебя получился верный :-))))
тут работает оператор:
void operator new (size_t size, void *ptr)
{
return ptr;
}
>
>
> > TRACE("Leave Magic.\n");
> > }
> > }
> >
> > int main()
> > {
> > Child child;
> > Child* pChild = &child;
> > Child& rChild = child;
> >
> > child.PrintMsg();
> > pChild->PrintMsg();
> > rChild.PrintMsg();
> > TRACE("\n");
> > child.Magic();
> > TRACE("\n");
> > child.PrintMsg();
> > pChild->PrintMsg();
> > rChild.PrintMsg();
> >
> > return 0;
> > }
> > ---
> > > > Результат: > > This function called from class Child.
> This function called from class Child.
> This function called from class Child.
>
> Leave Magic.
>
> This function called from class Child.
> This function called from class Parrent.
> This function called from class Parrent.
> ---
> > Это видимо какие то фокусы с перегрузкой таблицы > виртуальных функций ?
УГУ !!! именно такой вот эффект. в сущности получается, что *pChild != child;
я над этим примером сотни экспериментов проводил. впечатление, что у child - таблица статическая, а у всех остальных, даже если так -
child.Magic()
pChild = &child;
rChild = child;
динамическая. монопенисно !!!!! результат не изменим.
самое обидное, что GNU вообще не отреагировало на это, даже культурно послали на news forum, впечатление, что им по барабану. а M$ откликнулся - они просто написали каков результат, а причину так и не объяснили - отмахнулись ;-)
|
|
|