Я использую C-совместимую библиотеку, которая объявляет
typedef struct _gsk_oid {
int count;
gsk_uint32 * elements;
} gsk_oid;
Я не могу изменить библиотеку. Хотя в моем C++ мне нужна структура OID, которую я могу использовать как gsk_oid, но у которой также есть конструктор, поэтому я могу создать OID в коде. Так что я
struct oidX : public gsk_oid
{
oidX(int countX, gsk_uint32 first, ...);
oidX(const gsk_oid *inOID);
~oidX();
};
Таким образом, я могу написать, например, oidX testOID1(9, 1, 3, 6, 1, 5, 5, 7, 48, 1); , а затем использовать testOID1 в контексте, который ожидает gsk_oid.
Приведет ли это к неопределенному поведению? Я вижу странные результаты, которые не могу объяснить, и мне интересно, не является ли вышеизложенное приглашением к проблемам.
Что значит «плохая идея»? Кажется, это вопрос мнения.
Что std::is_pod говорит о ваших структурах?
Из cpp-core-guidelines: Предпочитайте конкретные типы, а не наследники классов
Такое наследование само по себе не является проблемой. В той степени, в которой есть проблема, она кроется где-то в не показанном коде. Для получения дополнительной помощи подготовьте минимально воспроизводимый пример.
@EtiennedeMartel Странные результаты заключаются в том, что я вызываю метод, который ожидает gsk_oid * в качестве параметра. Мой код отладки показывает ожидаемые значения в oidX, но код отладки в вызываемом методе показывает неверные значения.
@SamVarshavchik под «плохой идеей» я имею в виду, что это вызывает проблемы.
Почти все, что можно сделать на C++, может привести к каким-то проблемам. В таком наследовании нет ничего плохого. Он хорошо сформирован. В той мере, в какой проблемы вы видите, это не может быть связано исключительно с этим типом наследования, а связано с каким-то другим фактором.
@SamVarshavchik это тот ответ, который я ищу. Я не хочу, чтобы вы все отлаживали мою программу; Мне просто интересно, было ли наследование не-POD от POD и передача его по адресу методу, который ожидает POD, по своей сути проблематичным.
На будущее: вопрос, который вы действительно хотите задать в следующий раз, заключается в том, является ли что-то «неопределенным поведением». «Плохая идея» может оставаться плохой идеей в общем смысле, но это не будет неопределенным поведением. «Неопределенное поведение» имеет устоявшееся значение. «Плохая идея» — это чисто субъективный термин, который здесь обычно осуждается.
@SamVarshavchik достаточно честно. Я отредактировал вопрос.
Использование ..., как вы, является устаревшей конструкцией «C» (va_args) со всеми видами проблем (безопасность и безопасность типов). Подумайте о том, чтобы переписать свой код в функцию/конструктор вариативного шаблона, например. template<typename... ags_t> oidX(int countX, gsk_uint32 first, args_t&&...).





Нет.
На самом деле добавить больше нечего. Нет ничего, на что можно было бы указать, что это незаконно.
Кроме того, если бы это была проблема, компилятору было бы тривиально сказать вам, что вы делаете что-то глупое, а он этого не делает.
Как вы это используете? Что это за странные результаты?