У меня есть класс, который происходит из C-структуры. Класс не делает ничего особенного, кроме инициализации в конструкторе, функции деинициализации во время деструктора и нескольких других методов, которые вызывают функции C. По сути, это обертка для прокатки. Используя GCC, он жаловался, что мой деструктор не был виртуальным, поэтому я сделал это. Теперь я столкнулся с segfaults.Виртуальные функции в классах производных форм structs
/* C header file */
struct A
{
/* ... */
}
// My C++ code
class B : public A
{
public:
B() { /* ... init ... */ }
virtual ~B() { /* ... deinit ... */ }
void do()
{
someCFunction(static_cast<A *>(this));
}
};
Я всегда был в предположении, что static_cast
будет возвращать правильный указатель на базовый класс, отсечение от указателя виртуальной таблицы. Так что это может быть не так, так как я получаю segfault в функции C.
Удалив ключевое слово virtual
, код работает нормально, за исключением того, что я получаю предупреждение gcc. Какая для этого лучшая работа? Не стесняйтесь просвещать меня :).
Можете ли вы сделать A :: ~ A виртуальным? –
Нет, я не могу. Это общедоступный заголовок С. – MarkP
Почему бы не использовать класс вместо структуры? Разница очевидна, но та же цель достигнута. – Poni