#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 ! Тот факт, что он компилируется на некоторых компиляторах с включенными некоторыми флагами, возможно, является просто обратной совместимостью с какой-то исторической нестандартной древней реализацией. Нет смысла тратить время и энергию на этот код.