Войти
ПрограммированиеФорумОбщее

Полиморфизм с++ Что не так с этим кодом? (4 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#45
19:36, 3 фев. 2012

gammaker, слющай дарагой. Щито ты мне прописные истины то толкаешь? Ты, наверное, думаешь, шо ты мне тут нагаварил - америку открыл?
Ты текст воспринимай мало мало, на русском языке писанный: интересует сама возможность. А не то, как это можно использовать, для чего, почему, и нужно ли вапще. Ага?


#46
19:44, 3 фев. 2012

Kartonagnick
> интересует сама возможность.
Тогда вам точно в C# и К. Штатного механизма вызвать неизвестно что неизвестно с какими параметрами в С++ не наблюдается. Разве что платформозависимый.
upd. А нет, есть. Функции с произвольным числом параметров.

#47
19:56, 3 фев. 2012

Grey304, ну то что, штатных средств нет, это я уже давно понял)
Но, можно и не штатные... лишь бы это сработало.

#48
20:01, 3 фев. 2012

Kartonagnick
> Но, можно и не штатные... лишь бы это сработало.
Прикручиваете предварительную обработку, набодобии Qtшной, которая будет генерить метаинформацию - и вперед и с песнями.
За примерами, как рефлексия выглядит в C# - мсдн в помошь.

#49
20:10, 3 фев. 2012

А если всякие type_info использовать?

#50
20:12, 3 фев. 2012

Chipmunk
> А если всякие type_info использовать?
Он, похоже, хочет вызвать метод у неизвестного на момент компиляции типа. Такое только рефлексией.

#51
20:16, 3 фев. 2012

Chipmunk
> А если всякие type_info использовать?

type_info, ни typeid  - все это бесполезно.


Grey304
> Он, похоже, хочет вызвать метод у неизвестного на момент компиляции типа. Такое
> только рефлексией.

В том то и дело, что тип известен. В с++ после компиляции вообще все типы известны.
Другое дело, что воспользоваться этим знанием по человечески на с++ возможности нет.

Даже более того, у Страуструпа вычитал, что технических сложностей сделать красивую богатую возможностями динамическую идентификацию типов  для с++ не сложно.
Более того - на уровне компиляторов она итак реализована. Компиляторы знают о типах переменных все.
Но вот программистам нормальный RTTI так и не предоставили, причем специально. Что бы у них не возникало "соблазнов"(ц)Страуструп.

Александресску в качестве примера приводит sizeof:

"Её мощь удивительна. Эту функцию можно применять к любому сколь угодно сложному выражению, и она вернёт размер его результата не прибегая к вычислениям в ходе программы. Это означает, что sizeof распознаёт перегрузку, конкретизацию шаблонов, правила преобразования типов - все, что относится к выражениям на языке с++"(ц)

struct STest {   int a,b,c; };

STest get(); //у функции отсутствует тело. Но sizeof наплевать. 
                   //Она ничего не высчитывает, а тупо идентифицирует тип, и возвращает его размер

int main()
{
    std::cout<<sizeof(get() );
}


typeid в рантайме знает фактический тип полиморфа, а type_info можно его даже "запомнить".

Все есть! Кроме возможности этим по-человечески попользоваться.

#52
21:02, 3 фев. 2012

Kartonagnick
> В том то и дело, что тип известен.
  Тут он тоже известен?

> В с++ после компиляции вообще все типы известны.
  А вот оказывается нифига. Я вообще могу вызвать из dll метод неизвестного на момент компиляции основной программы типа и тут уже ничего не попишешь - тип неизвестен (если только не брать typeid, но тут его как-то обходят).

> Даже более того, у Страуструпа вычитал, что технических сложностей сделать
> красивую богатую возможностями динамическую идентификацию типов для с++ не
> сложно.
  В D всё, что только можно было, уже реализовано. Может быть там и это есть, но работа с типами во время компиляции поражает своими возможностями. Стоит только сказать, что там тип это просто переменная времени компиляции, которая может быть параметром шаблона наравне с любым известным в этот момент объектом, то есть даже с константным объектом пользовательского класса, а не так, как в С++ - только мелкая прослойка т.н. интегральных типов, которые в некоторых компиляторах вообще всегда приводятся к int. И с типами можно свободно работать, узнавая информацию о них через белые механизмы, а не через уродливые type_traits на шаблонах.
  Шаблоны в С++ и в D схожи, но различаются в ключевых позициях в пользу последнего. Поэтому в С++ шаблоны ближе к макросам (что не удивительно, ибо первый "компилятор" крестов был вынужден транслировать код с С++ сначала на Си), а в D это уже серьёзный инструмент обобщённого и мета-программирования.

#53
21:10, 3 фев. 2012

Zefick
> он тоже известен?
конечно. Сделай typeid, и удивись)

Zefick
> если только не брать typeid, но тут его как-то обходят

Да не в том дело, брать или не брать. А в том дело, что толку мало...

Zefick
> В D всё, что только можно было, уже реализовано.

Наслышан, да...

#54
21:58, 3 фев. 2012

>Она ничего не высчитывает, а тупо идентифицирует тип, и возвращает его размер
Только во время компиляции. Если использовать указатель, то по-любому sizeof покажет размер указателя, а не самого типа. Если его перед этим разыменовать, то - размер базового класса.

>> он тоже известен?
>конечно. Сделай typeid, и удивись)
Он становится известным только в рантайме. Ты никак не сможешь вызвать функцию производного класса без каста к нему. Я вообще не понимаю, как ты себе представляешь эту возможность? Если компилятор ругается на ptr->Test(), то как по-твоему в коде должен выглядеть этот вызов.

>на русском языке писанный
Что-то я сомневаюсь, что это на русском:
>слющай дарагой
>Щито
>нагаварил
>вапще

Тебе вообще зачем всё это? Не верю, что интерес теоретический: ты бы не был бы таким агрессивным. Тебе пытаются ответить, а ты всех посылаешь, говоря, что от них нет никакого толку.

>Щито ты мне прописные истины то толкаешь? Ты, наверное, думаешь, шо ты мне тут нагаварил - америку открыл?
Я тебе их толкаю для того, чтобы ты, проанализировав это, понял, что нет такой возможности в C++. Если тебе это так надо, пиши на D. Там есть диспетчеризация методов, и такое достаточно легко реализовать. Только стоит ли? Компилятор будет молчать, если ты опечатаешься и вместо Test напишешь Tesst. А проблемы вылезут только в рантайме. Тебе это надо?

#55
22:16, 3 фев. 2012

Хватит стрелять по ногам, давай сразу в голову

#56
2:28, 4 фев. 2012

Троллинг

#57
3:05, 4 фев. 2012

Kartonagnick

>Но тогда такой вопрос: существует ли способ, как обойти это ограничение, и получить доступ к методам потомка?
>Не делая при этом явного приведения типов

Ручками высчитать смещения и обратится через указатель к методу.

>Я собрался найти ответ, на чотко поставленный вопрос. Шо за манера дураццкая? Задаёшь один вопрос, ответы вапще на другие вопросы

ха -ха:
"существует ли способ, как обойти это ограничение" - очень точно посталенный вопрос, а главное сразу же ясно, что: пишем на С++ в обход С++. Чтобы устранить этот недостаток в виде компилятора c ограничениями, можно воспользоваться другим, например brainfuck.

>Ну а если даже, пусть и не портируемый полухаккерский трюк?
до этого речь шла о том, что компилятор C++ не позволяет писать бред. Теперь  предложение хакнуть этот компилятор, чтобы он с.ка перестал ограничивать. Если последствия случайного обрашения к Kernel.dll c просьбой format c: не пугают, то можно найти в интернете открытый код компилятора, выкинуть нафиг из него это ограничение, и уже собственным компилировать данные программы. Правда язык будет не с++ и не c#. Предлагаю назвать c-- "--" значит c без ограничений (выкинули ограничения).

>Смысл как раз таки в том, что бы "не ведая типа" в рантайме толкнуть метод, который знание об этом самом типе вернет.
Это нужно в компилятор c-- добавить фичу, чтобы при последнем создании объекта, переменной, динамически или статически чтобы сразу же по этому адресу писался тип в unicod формате такой же как в текстовом редакторе. Очень было бы полезно. Правда зачем это нужно от продвинутого компилятора.

Пишем:
Byte a;
a = new Byte;
а затем
a->run();
в данном случае компилятору как раз не нужно знать что у типа Byte нет метода run. Всё равно пусть выполняется переход по рандомному адресу.

>Во втором случае - явно указывается программистом
Ну в общем то да, отличная идея.
теперь так:

byte a;
a = new byte[11];// создаём массив байт из 11 чисел.
SetNewType(a,int); // объявляем, что созданный массив из 11 байт 
//является новым массивом из 11 int того же размера.
a->run(); // компилятор с-- отличная вещь. Каким типом не объяви 
//а, всегда можно выпонить a->run();

>не о том речь, что он должен, или не должен. А о том речь, как вообще получить знание об истинном типе
да в общем то исполняемая программа не помнит о своих типах. О бо всё заботится компилятор на стадии компиляции. В связи с этим нет такого понятия как истинный тип и тип вооще. Процессор складывает, вычитает, ставнивает и переходит по указанному адресу. А куда именно в c++ об этом знает компилятор.
Можно открыть откомпилированный код дизассеммлером и подправить переходы.

>Чем таким принципиальным пляски с typeid отличаются от динамик_каст?
разница примерно как сравнивать круг и матрицу.

>[b]LuckyMan[/b], представь себе, что у тебя есть на руках Base* ptr;
>Ты не знаешь его настоящего типа. Но знаешь, что у него есть метод test();
история повторяется.
бла бла бла base* ptr; Даже не важно что тип его base. Всё равно какой тип. Но вот очень хочется сделать ptr->run(); Как я писал выше - эта с.ку c++ сделать так незачто не даст, только c-- или brainfuck. Наверняка есть ещё компиляторы. Такие идеи должны были приходить программистам и ранее.

>Но, можно и не штатные... лишь бы это сработало.
согласен, воспользуйся нештатным компилятором.

>В том то и дело, что тип известен. В с++ после компиляции вообще все типы известны.
>Другое дело, что воспользоваться этим знанием по человечески на с++ возможности нет.

Знаете, я с Вами Kartonagnick впервые не соглашусь. Я программирую ~c 1993 года и нормально пользуюсь знаниями о типах объявленных переменных.

>Даже более того, у Страуструпа вычитал, что технических сложностей сделать красивую богатую возможностями динамическую идентификацию >типов для с++ не сложно.
Я с ним согласен. И удивляюсь, почему данный механизм до сих пор не введён в стандарт c++.

...
весь этот перл написал затем,  чтобы Kartonagnick задумался над тем что будет, если у компилятора отнять возможность контролировать хаотические переходы программы.

#58
4:18, 4 фев. 2012

KKH
> Ручками высчитать смещения и обратится через указатель к методу.

Вот с этого момента поподробнее, пожалуйста.

#59
4:45, 4 фев. 2012

А если все вызовы метода заинлайнены, а неинлайненого не оставили?

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.