Автор
|
Тема: Q about "this"..
|
lx |
опубликован 22-08-2001 14:29 MSK
Народ, есть такая модель:класс А: метод1 , метод2, ... далее: класс В, класс С и тд - все производные от А с переопределенными методами (метод1, метод2 и тд...). Можно ли сделать так, что бы this в классе B стал this для класса С например? Если можно, то как? Ведь this фактически представляет из себя просто контейнер указателей на члены таблицы виртуальных методов, то есть теоретически это сделать возможно. Но как это синтаксичечки реализовать? Мож я чего не понимаю, сорри. пасибо.
|
stan
|
опубликован 22-08-2001 14:35 MSK
Если есть кусок кода CSomeClass a; то &a это и есть this. Где хочешь, там и используй |
stan
|
опубликован 22-08-2001 14:36 MSK
Если есть кусок кода CSomeClass a; то &a это и есть this. Где хочешь, там и используй |
Flex Ferrum
|
опубликован 22-08-2001 15:18 MSK
Не получится. Если ты имеешь в виду иерархию типа: class A { public: virtual void F1(); virtual void F2(); };class B : public class A { public: virtual void F1(); virtual void F2(); }; class C: public class A { public: virtual void F1(); virtual void F2(); }; То, this в классе B у тебя указывает в том числе на таблицу виртуальных функций, переопределенных в классе B, а this в классе C - соответственно та vtable класса C. И эти две таблицы ни при каких условиях совпадать не будут. По сему, в "находясь" в классе B ты никаким образом не сможешь получить доступ к vtable класса C и наоборот. А синтаксически реализовать эту идею можно так, но, как я сказал выше, корректно работать это не будет: void * Ptr = this; C * pC = (C *)Ptr;
|
lx
|
опубликован 22-08-2001 16:59 MSK
stan: я наверно неясно изложил, поэтому твой ответ вовсе таковым не является. Flex Ferrum: конструкция то такая. но ответ не совсем тот. это как бы внешняя смена типа. А можно ли тоже проделать внутри объекта? тут даже как то трудно объясить. как бы вот сидя внутри запорожца переделать его в мерен? -) скажем так. хотя тоже не точно сформулирован вопрос. ну может кто нить такие фокусы делать умеет поделитесь. пасиба |
Flex Ferrum
|
опубликован 22-08-2001 17:11 MSK
Ммммм... То-есть ты хочешь в рантайме поменять одну виртуальную таблицу на другую? Не затрагивая при этом данные? ИМХО, для этого тебе придется разабраться в структуре того, на что указывает this (где там указатели на базовые классы, где на vtable и т. п.), после чего аккуратно ручками заменить одно на другое. Но это будет, в общем случае, работать только для данной конкретной реализации данного конкретного компилятора. И то, если хранится указатель на vtable. Если же vtable при конструировании копируется в объект, то вообще никак. |
lx
|
опубликован 22-08-2001 17:50 MSK
вот то то и оно. ты правильно понял. пока я сам в эти дебри не полезу. может фокусник все же найдется. а вот насчет привязки к компилятору - это трабла мощная. если ответов не будет, буду выяснять. |
Flex Ferrum
|
опубликован 22-08-2001 17:54 MSK
А может быть, над иерархией поработашь. Ведь, по сути дела, наследование для этого и придумывали. Попробуй применить множественное наследование. |
lx
|
опубликован 22-08-2001 19:23 MSK
в том то и дело, что с наследованием все уже сделано как надо. просто када мне задание давали, первое что пришло в голову - это "крякнуть" this. Но я чуть себе голову не крякнул и сделал по крестьянски. А вопрос с this остался. И мучает. Но все равно спасибо. |