Виртуальная функция, вызывающая ошибку сегментации
Я получаю ошибку сегментации, когда пытаюсь получить доступ к виртуальной функции. Код в основном так:
class Super {
public:
Super() { cout << "Ctor Super" << endl; }
virtual void test() = 0;
};
class Sub : public Super {
public:
Sub() { cout << "Ctor Sub" << endl; }
void test() { cout << "Test in Sub" << endl; }
};
void main()
{
Super* s = new Sub;
s->test(); // Segmentation fault So I tried the one below
Sub* s1 = new Sub;
s1->test(); //Still segmentation fault
Sub s2;
s2.test(); // Works fine BUT
Super *s3 = &s2;
s3->test(); // segmentation fault and EVEN
Sub *s4 = &s2;
s4->test(); //segmentation fault
}
Я перепробовал почти все, что я знаю о виртуальных функциях, и это не работает. На самом деле это часть более крупной программы, поэтому там могут возникнуть некоторые проблемы, но как только я удаляю виртуальную функцию или перестаю делать ее виртуальной, она работает. Есть идеи?
Также есть какой-нибудь инструмент или способ проверить vtable?
3 ответа
Может ли этот код скомпилироваться вообще?
- Все ваши методы являются частными.
- Там нет наследства между Sub и Super.
- Конструктор неверно назван.
- Функция main() не возвращает int.
Исправление всех этих результатов в коде, который компилируется и выполняется без segfault.
Class Sub не наследуется от класса Super, поэтому они никак не связаны, как написано в настоящее время.
Я не вижу, что может вызвать проблему, кроме ошибки компилятора. Можете ли вы дать точную версию компилятора?
А пока я бы попробовал следующее:
- добавить манекен
int
Участник классов. Возможно, класс нулевого размера вызывает неправильную генерацию кода. - объявлять
Sub::test()
как виртуальный тоже. Опять же, может быть компилятор ведет себя неправильно.
Кроме того, какой тип ошибки сегментации вы получаете? Это точно SIGSEGV
или это еще один сигнал? Не могли бы вы дать отладчику обратную трассировку и дамп локальной сборки?