【问题标题】:Why does this inheritance throw a stack overflow exception? [duplicate]为什么这个继承会抛出堆栈溢出异常? [复制]
【发布时间】:2021-11-05 15:21:44
【问题描述】:

我正在尝试使用 Unity3D 和 .Net 控制台应用程序作为服务器制作多人游戏。

现在我创建了一个 mainGame 类,它继承了 ServerTime 类,它也应该在创建 maingame 类时初始化(因此它在 maingame 的构造函数中)

但问题是,它会在 ServerTime 的构造函数上引发堆栈溢出。

public class Program
{
    public static void Main()
    {
        new mainGame("JustAName");
    }

    public class mainGame
    {
        public ServerTime serverTime = null;
        public mainGame(string a_Roomnme)
        {
            serverTime = new ServerTime(null);
        }
    }

    public class ServerTime : mainGame
    {
        public ServerTime(string roomName): base(roomName)
        {
            //Do something
        }
    }
}

因为它只是简单地将字符串传递给 ServerTime,所以我看不出它会在哪里导致这样的异常。

提前谢谢你

【问题讨论】:

  • mainGame 初始化一个ServerTime 对象,该对象调用mainGame 基类,该基类创建一个ServerTime 对象等等。在调用堆栈中应该很明显
  • 新 mainGame -> serverTime -> new mainGame -> serverTime -> new mainGame -> serverTime -> new mainGame -> serverTime -> new mainGame -> serverTime -> new mainGame -> serverTime ->新主游戏 -> serverTime ¯\_(ツ)_/¯
  • 如果你让别人给你拿杯咖啡,他们问是哪一种,你让他们给你拿杯咖啡,你期望会发生什么?你陷入了无限循环。现在,如果您每次请他们喝咖啡时都必须写下来以跟踪请求,那么您的纸张将用完。必须付出一些东西

标签: c# .net


【解决方案1】:

main 函数初始化一个mainGame 对象。这个对象有一个ServerTime 成员。 ServerTime 成员已初始化,但由于 ServerTime 继承自 mainGame,它调用其父级的构造函数 - 这意味着它初始化了另一个 ServerTime 对象,依此类推,无休止(或者,至少,直到堆栈溢出异常被抛出)。

【讨论】:

  • 这是有道理的,但如果我删除 serverTime 对象(和行:serverTime = new ServerTime(null)),则不会调用 ServerTime 的构造函数。如果它已经被 mainGame 构造函数初始化,那不应该发生吗?
  • @cc500 是的,没错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多