Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
#1

Наследование от виртуального класса - C++

18.11.2012, 03:07. Просмотров 620. Ответов 7
Метки нет (Все метки)

Хукаю DirectX с помощью Detours.
Делаю обёртку. Пишу много обезьяньего кода.
Получаю такой месседж:
перегружающая виртуальная функция отличается от "IDirect3D9::EnumAdapterModes" только соглашением о вызове
С winAPI знаком поверхностно. С DirectX ещё более поверхностно. Но задача требует выполнения (какая - читайте историю моих сообщений).
С Си++ знаком на уровне страшной комбинации Си кода, Си++ кода и ассемблерных вставок (хардкор, только хардкор).
Следовательно вопрос - что за виртуальные функции, с чем их едят... ой... читать учебники я умею. Неправильно задаю вопрос...
Вот так - каким образом мне перегрузить виртуальную функцию, чтобы VSC++2010 не ругалась на эти перегрузки.

P.S. В перегруженном методе - вызов метода из класса-родителя (лишь парочка заполнена зловещим кодом).
P.P.S. Если интересует обезьяний код - прикрепил в аттачи (просьба не падать в обморок, больше половины - копипаста).
P.P.P.S. Detours 1.5.
http://www.cyberforum.ru/cpp-beginners/thread1991106.html
0
Вложения
Тип файла: zip lol.zip (593.3 Кб, 3 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2012, 03:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Наследование от виртуального класса (C++):

Вызов виртуального метода класса наследника из вектора
#include <iostream> #include <vector> using namespace std; class A {...

Вызов виртуального метода базового класса из указателя производного
Допустим есть такой код: #include <iostream> class Base { public:...

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h...

Нужно ли прописывать конструктор и деструктор для чисто виртуального абстрактного класса
Всем привет! Порылся в интернете, но не смог найти конкретного ответа на свой...

Наследование методов класса
Я пишу программу на наследование классов.Базовый - Person , с объектами имя ,...

7
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
18.11.2012, 03:10 #2
это видимо новый тренд
выкладывать куски кода и текст ошибки с указанием строки ныне не модно
0
Croessmah
++Ͻ
14158 / 8083 / 1513
Регистрация: 27.09.2012
Сообщений: 19,919
Записей в блоге: 3
Завершенные тесты: 1
18.11.2012, 03:13 #3
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Следовательно вопрос - что за виртуальные функции, с чем их едят... ой... читать учебники я умею.
Да тут дело не в виртуальности, а вот в чем:
C++
1
2
3
4
int foo(int x){
}
char foo(int x){
}
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Вот так - каким образом мне перегрузить виртуальную функцию, чтобы VSC++2010 не ругалась на эти перегрузки.
Измените список параметров
1
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
18.11.2012, 11:46  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Измените список параметров
Так ведь вся суть именно в том, чтобы подменить класс IDirect3D9 на собственную реализацию. Подгружая dll-кой программа будет работать, используя наш враппер и можно будет внедрить свой добрый (или не очень) код.
Тем более, что возвращающее значение одинаковое...
Разве только добавить бессмысленный аргумент со значением по умолчанию... В общем, попробую. Надеюсь - поможет.

Добавлено через 17 минут
Цитата Сообщение от alex_x_x Посмотреть сообщение
выкладывать куски кода и текст ошибки с указанием строки ныне не модно
Простите, но специально для Вас я пережал в zip проект и кинул в аттач.
Просто бессмысленно кидать один и тот же код. Но если кратко, то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Direct3D9Wrapper : public IDirect3D9
{
public:
 
    Direct3D9Wrapper( LPDIRECT3D9 pDirect3D );
    ~Direct3D9Wrapper();
 
    HRESULT QueryInterface(REFIID riid, void** ppvObj, int dummy = 0);
    ULONG AddRef(int dummy = 0);
    ULONG Release(int dummy = 0);
//туева хуча подобных методов
    HMONITOR GetAdapterMonitor(UINT Adapter, int dummy = 0);
    HRESULT CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface, int dummy = 0);
 
    IDirect3D9* Direct3D9;
Если без dummy - кидает ошибку на каждый из методов.
Правда я не знаю, как поведёт себя приложение, когда я запущу его с это dll-кой. Сейчас всё соберу и посмотрю.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2012, 11:49 #5
Цитата Сообщение от AnyOne697 Посмотреть сообщение
C++
1
2
ULONG AddRef(int dummy = 0);
ULONG Release(int dummy = 0)
;
почему эти методы с параметрами?
IDirect3D9 наследует IUnknown в котором для этих методов никаких параметров нет
1
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
18.11.2012, 12:01  [ТС] #6
Ну конечно, что я делаю? Какой dummy? Методы наследуются. И они чистые. Мне теперь объект класса не создать! Эх...
Актуальность только растёт.

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
почему эти методы с параметрами?
IDirect3D9 наследует IUnknown в котором для этих методов никаких параметров нет
Цитата Сообщение от AnyOne697 Посмотреть сообщение
перегружающая виртуальная функция отличается от "IDirect3D9::EnumAdapterModes" только соглашением о вызове
Цитата Сообщение от Croessmah Посмотреть сообщение
Измените список параметров
И что с этим делать?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2012, 12:06 #7
Цитата Сообщение от AnyOne697 Посмотреть сообщение
И что с этим делать?
изучить основы COM и написать реализацию этих методов
0
AnyOne697
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
26.11.2012, 20:41  [ТС] #8
Неделю спал, проснулся, взялся вспоминать... Не очень...

Цитата Сообщение от Jupiter Посмотреть сообщение
изучить основы COM и написать реализацию этих методов
Не совсем понял... Я же вроде реализацию сделал... Однострочную. Но сделал. Это банальная обёртка... Почему она не работает?.. Не понимаю... Часа два сидел и писал скрипт-генератор реализаций. Но не работать. Наверное, я просто плохо знаю Си с плюсами. Возможно, я просто не то наследую. Мне нужно инъектировать dll-ку и получить доступ к поверхностям DirectX. Что вообще твориться с этим миром? Зачем всё так сложно?
0
26.11.2012, 20:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 20:41
Привет! Вот еще темы с решениями:

Наследование класса Вектор
Помогите написать прогу плииззз.... Разработать класс NormVector – вектор...

Наследование, конструктор класса
Объясните мне пожалуйста, что значит такая конструкция: class...

Наследование класса String
Начал осваивать ООП С++ и решил в виде практики добавить в класс #include...

Наследование абстрактного класса
Не могли бы вы мне объяснить данный код: Actions *NewAct = new Array(); //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru