Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование: можно получить typeid() дочернего класса в конструкторе базового? / 16 сообщений из 16, страница 1 из 1
25.03.2017, 17:16
    #39427072
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Пытаюсь в своей либе переделать сообщения на объекты с наследованием. Споткнулся на контроле типов.

Надо как-то typeid().hash_code() дочернего узнать в родительском классе, но при этом ничего не писать в коде дочернего.

Так не работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class A {
	size_t _type;
public:
	A() {
		_type = typeid(this).hash_code();
		printf("type %s \n", typeid(this).name());
	}

	void type_A() {
		printf("type A = %X \n", _type);
	}
};

class B : public A {
	int x;
public:

	void type_B() {
		printf("type B = %X \n", typeid(this).hash_code());
	}
};

void main() {
	B* b = new B();
	b->type_A();
	b->type_B();
	delete b;
}


Результатtype class A *
type A = E285AD67
type B = 216C60B2

Понятно что базовый понятия не имеет про дочерний, но может есть какой-то хитрый ход, которого я не знаю.
...
Рейтинг: 0 / 0
25.03.2017, 19:19
    #39427088
YesSql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima T,

Дима, оставь муму в покое. 20312833 . Другого варианта нет.
...
Рейтинг: 0 / 0
25.03.2017, 19:41
    #39427093
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
YesSqlDima T,

Дима, оставь муму в покое. 20312833 . Другого варианта нет.
Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним.
...
Рейтинг: 0 / 0
25.03.2017, 20:22
    #39427107
YesSql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima TYesSqlDima T,

Дима, оставь муму в покое. 20312833 . Другого варианта нет.
Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним.
10% попугаев на каждый тип сообщений?
...
Рейтинг: 0 / 0
25.03.2017, 21:16
    #39427117
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima TПомучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним.
dynamic_cast работает за счет той же инфы что и typeid. Поэтому в конструкторе предка если он и приводит к нужному типу, то все равно это UB.
В конструкторе предка информации конкретном наследнике еще нет, т.к. она устанавливается конструктором наследника, который вызывается после предка.

Хотя если это борланд то есть другие варианты.)))
...
Рейтинг: 0 / 0
25.03.2017, 21:21
    #39427124
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima T,

Гыгыгы, а ты всё продолжаешь на спичках экономить вместо того, чтобы заниматься делом
...
Рейтинг: 0 / 0
25.03.2017, 22:08
    #39427139
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima T,

НЕЛЬЗЯ!
...
Рейтинг: 0 / 0
25.03.2017, 22:14
    #39427143
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Anatoly Moskovskydynamic_cast работает за счет той же инфы что и typeid. Поэтому в конструкторе предка если он и приводит к нужному типу, то все равно это UB.


Да не приводит оно к наследнику, пока конструктор наследника не будет выполнен, точнее, пока управление не попадет в тело конструктора наследника.
...
Рейтинг: 0 / 0
25.03.2017, 22:43
    #39427152
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima T,

по идее никак, это сделано для оптимизации

но можно просто в конструктор как параметр передать уже готовый хеш, извратившись макросом(-ами)
...
Рейтинг: 0 / 0
26.03.2017, 04:08
    #39427198
YesSql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima TYesSqlDima T,

Дима, оставь муму в покое. 20312833 . Другого варианта нет.
Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним.
С dinamic_cast ты получишь O(N) а с хэшем O(log N).
...
Рейтинг: 0 / 0
26.03.2017, 09:13
    #39427210
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Anatoly Moskovskydynamic_cast работает за счет той же инфы что и typeid.
Да, но я могу его не считать каждый раз: при создании сообщения 1 раз посчитать и при создании получателя 1 раз указать принимаемый тип, а дальше сравнения size_t _type для контроля типа, а приведение static_cast
...
Рейтинг: 0 / 0
26.03.2017, 09:36
    #39427222
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
YesSqlDima Tпропущено...

Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним.
10% попугаев на каждый тип сообщений?
Я меняю скорость прогона сообщений: примитивные обработчики и большие цепочки обработчиков.
10% это стоимость добавления dynamic_cast в каждую обработку сообщения. Т.к. обработка примитивная, то стоимость получается высокая.
Если обработка будет в 100 раз тяжелее, то цена dynamic_cast будет 0.1%. Фигня, погрешность измерения.

Можно и на dynamic_cast остановиться, но из-за этого становится менее выгодно делать длинные цепочки примитивных обработчиков.
С другой стороны цепочки на практике не будут длинными: 3-5 обработчиков, а не 100+. Посчитать typeid().hash_code() стоит столько же как и dynamic_cast.
Вобщем пока думаю, торопиться некуда.
...
Рейтинг: 0 / 0
26.03.2017, 09:45
    #39427224
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Как вариант: отдать заполнение msg->type пользователю: хочет быстро - пусть вводит свою типизацию и использует static_cast, не хочет - dinamic_cast.
Наверно на нем и остановлюсь. Все равно typeid().hash_code() в switch() не вставить.
...
Рейтинг: 0 / 0
27.03.2017, 05:12
    #39427492
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
Dima TНадо как-то typeid().hash_code() дочернего узнать в родительском классе, но при этом ничего не писать в коде дочернего.запоминай его в конструкторе, если он ещё не запомнен.
...
Рейтинг: 0 / 0
27.03.2017, 07:24
    #39427506
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
CEMbзапоминай его в конструкторе, если он ещё не запомнен.
предлагаешь этот код в каждом конструкторе наследника писать?
...
Рейтинг: 0 / 0
27.03.2017, 12:00
    #39427651
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
kealon(Ruslan)предлагаешь этот код в каждом конструкторе наследника писать?да. Более простого способа получить такой id я не вижу, только в конструкторе и деструкторе у нас тип(this) того класса, в котором мы в данный момент находимся.
И, да, там у меня ошибка в логике, не надо делать проверку. Т.е. id в результате перезатрётся самым актуальным id-ом, что и требуется.
Или вот такой извращенский вариант, если бы меня совсем прижало, я бы так сделал (в самом крайнем случае!): посмотреть на сгенерированный код, там компилятор подменяет данные текущего объекта, виртуальную таблицу и всё прочее, потом выполняет конструктор/деструктор, потом возвращает всё назад. Вот после подмены взять из "кеша" реальные данные, скастить их к текущему классу и выполнить нужные действия.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование: можно получить typeid() дочернего класса в конструкторе базового? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]