Ошибка сегментации наследования классов C ++ - PullRequest
1 голос
/ 05 марта 2020

Я делаю что-то с C ++, где я делаю объект абстрактного класса Parent и инициализирую его в функции для дочернего класса. Когда я инициализирую объект при его создании, все творит чудеса. Когда я инициализирую его в функции, я получаю ошибку сегментации.

Вот схема кода того, что я делаю

_class.h

#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED

class Parent{
  public:
    virtual void foo() = 0;
};

class Child1 : public Parent{
  public:
    virtual void foo(){
      ...
    }
};

class Child2 : public Parent{
  public:
    virtual void foo(){
      ...
    }
};

#endif

main. cpp

#include <iostream>

using namespace std;

#include "main.h"
#include "_class.h"

void setChild(Parent* c){
  c = new Child1();
}

int main() {
  Parent* c;// = new Child1();

  setChild(c);

  c->foo(); //Seg Fault
}

Очевидно, я мог бы просто инициализировать в main, но я бы предпочел инициализировать в функции. Возможно ли это, и если да, то что я делаю не так?

1 Ответ

2 голосов
/ 05 марта 2020

Вы устанавливаете локальный c в setChild для нового объекта, но объект в main не изменяется. Есть два способа изменить значение в вызывающей стороне.

Один из них - передать параметр по ссылке:

void setChild(Parent*& c)

другой - вернуть его, а не использовать параметр * 1009. *

Parent *setChild() {
    return new Child1();
}
...