В C++ У меня есть пакет базового класса, а затем много детей APIPacket, DataIOPacket и т. Д. Теперь я хочу сохранить входящий пакет, и поскольку я не знать тип хранить это в переменной:Функции вызова наследования C++ из дочернего элемента из переменной родительского класса
Packet packet;
packet = DataIOPacket();
Но теперь DataIOPacket имеет функцию getAnalogData(); Я не могу сделать:
packet.getAnalogData();
Поскольку пакет не имеет этой функции. В java я думаю, что это возможно, так как фактический тип объекта, хранящегося в пакете, не теряется (это правильно?). Но в C++ мой DataIOPacket сужается в Packed и теряет его функции, которые не были объявлены в пакете.
Вы можете сделать виртуальную функцию в пакете для каждой функции в каждом дочернем элементе. Но для меня это означало бы множество функций в пакете, которые в большинстве случаев не следует вызывать. Не использовать вызов getAnalogData() в APIPacket.
Как решить эту проблему? Я не могу найти ответ, но я чувствую, что многие люди должны его встретить.
Вы можете что-то сделать с приведением типов в DataIOPacket и APIPacket, но это не похоже на чистое решение.
Возможно, библиотеки, которые решают мою проблему?
Rgds,
Рул
[Соответствующий] (http://stackoverflow.com/q/15306367/1174378) –
Я изменил пакет Packet(); 'на' Packed packet; 'так, чтобы он определял объект (а не прототип функции) , чтобы соответствовать его описанию. Это не устраняет непосредственную проблему: когда вы храните объект производного типа в качестве объекта «Packet», производный объект получает срез для объекта «Packet». 'packet' ** не ** - объект производного типа. Код должен хранить указатель или ссылку на «Пакет», а не на объект. –