Армянское Радио: что-то я совсем запутался. Вместо присвоения ссылки скопировал объект. Работает полиморфизм по ссылке, работает. Что-то меня с просони занесло :-)
Армянское Радио: ну и даже с O3 моя писулька работает. Если это нужно для грязного хака на 10 минут, то можно и попробовать. В продакшне за такое убили бы на месте, это да.
Армянское Радио: В статье разыменовывается указатель и превращается в ссылку. Вызов метода по ссылке всегда не виртуальный, т.к. приведение ссылки одного типа к другой - "undefined behavior", и тогда нет смысла лезть в таблицу, т.к. если есть ссылка - то это либо объект известного из ссылки типа (и тогда полиморфизм не нужен), либо ошибка. gcc даже с отключенными напрочь оптимизациями вызывает методы ссылки по адресу, а не через таблицу.
Pavel K: Я вам целый проектик запилил. https://github.com/fshp/vtable
Пару выводов - виртуальные функции, при вызове по ссылке, ведут себя как обычные, т.е. вызываются напрямую, минуя таблицу виртуальных функций. Значит для вашей задачи подходит только вызов по указателю.
Ну и компилировать нужно со специфичными флагами, что бы секция .text (там лежит таблица) была доступна для записи.
Таблицы виртуальных функций не являются частью стандарта и их реализация даётся на откуп разработчикам компиляторов. Значит разные компиляторы могут реализовывать их совершенно по разному. Так что код с одним компилятором может работать, а с другим - нет (даже с разными версиями одного компилятора могут быть проблемы). Я использовал gcc-4.9.
Pavel K: а, не правильно прочёл вопрос. Да, конечно можно. Обычный метод ничем не отличается внутри от виртуального, кроме как механизмом вызова через таблицу.
Pavel K: нет, т.к. вызов обычного метода происходит непосредственно по адресу. Но если вынести класс в динамическую библиотеку, то возможно подшаманить что-то в таблице импортов. Ну есть ещё хак - записать в рантайме в начало подменяемой функции jmp на нужную функцию. Но на современных ОС такой хак вряд ли получится провернуть из-за DEP - сегменты кода помечены как ro.
Pavel K: только учтите, что таблица виртуальных функций - статическая. Т.е. одна на все объекты класса. Поменяв указатели вы измените поведение всех объектов класса.
Александр Козак: делаете ребейз с первого коммита, вносите нужные версии, коммитите их, указав параметр --date. Затем делаете мерж последней добавленой в ребейзе версии и первой из истории git. Заканчиваете ребейз. Радуетесь.
"Искал в апи но не нашел, может перевод между своими кошельками можно без комиссии устроить?"
Между какими "своими"? Нет никаких "своих" кошельков. Есть набор адресов. А кому они принадлежат знает только владелец.
"Если пользователь захотел вывести деньги"
Тут не понятно, куда он захотел вывести? Получить обратно рубли или перевести на свой адрес с кошелька сайта?