【问题标题】:C++ Class Inheritance Segmentation FaultC++ 类继承分段错误
【发布时间】:2020-03-05 16:26:24
【问题描述】:

我正在用 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 中初始化,但我宁愿在函数中初始化。这可能吗,如果是,我做错了什么?

【问题讨论】:

  • Parent* c 通过引用(特别是通过指针)传递父级,但指针本身是按值传递的。 c 是调用者参数的副本,对副本所做的更改不会在调用者处复制。使用参考:void setChild(Parent* &amp; c).
  • Parent** p 传递给setChild 并将new Child1(); 的结果分配给*p

标签: c++ class inheritance segmentation-fault


【解决方案1】:

您将setChild 中的本地c 设置为一个新对象,但main 中的那个没有更改。有两种方法可以改变调用者中的值。

一种是通过引用传递参数:

void setChild(Parent*& c)

另一种是返回它,而不是使用参数

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

【讨论】:

  • 有时我讨厌 C++。被 & 击败。我会尽快接受你的回答。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多