ошибка сегментации при вызове конструктора базового класса в производном классе

#c

#c

Вопрос:

я получаю ошибку сегментации при вызове конструктора базового класса из производного класса в c . я использую приведенный ниже код.

 #include <iostream>
using namespace std;
class A {
protected:
    int x;

public:
    A()
    {
        x = 10;
        cout << "value of X in A is" << x << "n";
    }
};
class B : A {
private:
    int z;

public:
    B()
    {
        A::A();
        z = 20;
        cout << "value of z in B is" << z << "n";
    }
};
int main()
{
    B* logger;
    logger = new B;
}
  

при сборке я использовал опцию -fpermisson для сборки этого кода, иначе он показывал приведенную ниже ошибку.

 main.cpp: In constructor ‘B::B()’:
main.cpp:19:7: error: cannot call constructor ‘B::A’ directly [-fpermissive]
  A::A();
       ^
main.cpp:19:7: note: for a function-style cast, remove the redundant ‘::A’
  

когда я пытаюсь запустить этот код, я получаю ошибку сегментации. Чтобы понять проблему, я провел некоторую отладку и увидел, что когда я пытаюсь создать объект B, конструктор A вызывается бесконечно, что создает ошибку сегментации (я так думаю).
Я не настолько разбираюсь в C , пожалуйста, помогите мне понять, что я здесь сделал не так. я использую среду Linux для тестирования этого.

Комментарии:

1. ваш код является недопустимым C , как показывает ваша ошибка. Итак, какова цель понимания недопустимого кода C ?

2. чего вы пытаетесь достичь?

3. я просто пытался понять, может ли конструктор базового класса напрямую вызывать из производного класса. тот же код работал в visual cpp.

Ответ №1:

Вы не можете вызвать конструктор напрямую, как это:

 A::A();  // error
  

Использование дополнительных флагов для создания программы — это нормально, за исключением того, что вы не можете ожидать, что программа будет работать.

Если вы хотите вызвать конструктор базового класса, вы можете сделать это в списке инициализаторов элементов:

 B() : A()
{
    z=20;
    cout<<"value of z in B is"<<z<<"n";
}
  

В этом случае в этом нет необходимости, потому что конструктор по умолчанию будет вызван в любом случае.

Комментарии:

1. спасибо за ответ. я понял, что это проблема из моего кода. просто для любопытства, почему конструктор A получает неопределенность вызова, когда я использую приведенный выше код.

2. На самом деле, информации недостаточно, чтобы понять это. Это зависит от многих вещей.

3. ОК. я попробовал тот же код в visual cpp и увидел, что он там работает. но не уверен, почему он показывает разное поведение в разных средах.

4. Не беспокойтесь об этом 🙂 Понять, как работает c , может быть немного сложно, но попытаться понять, как это не работает, намного сложнее.

5. @user8759451 то, что у вас есть, является недопустимым кодом C . Вы никогда больше не увидите этот код, вы никогда больше не напишете этот код. Я говорю это снова: это недопустимый код C ! Тот факт, что он компилируется на некоторых компиляторах с включенными некоторыми флагами, возможно, является просто обратной совместимостью с какой-то исторической нестандартной древней реализацией. Нет смысла тратить время и энергию на этот код.