Виртуальная функция, вызывающая ошибку сегментации

Я получаю ошибку сегментации, когда пытаюсь получить доступ к виртуальной функции. Код в основном так:

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 или это еще один сигнал? Не могли бы вы дать отладчику обратную трассировку и дамп локальной сборки?

Другие вопросы по тегам