一个过深的C++类层次结构会导致堆栈溢出吗?

3 c++ stack-overflow stack callstack distributed-computing

假设我有一个C++程序具有过深的继承,如下所示:

using namespace std;

class AbstractParentGeneration0 {
    private:
      ...
    protected:
      ...
    public:
      virtual returnVal funcName(void) = 0;
};

class AbstractParentGeneration1: virtual public AbstractParentGeneration0 {
    private:
      ...
    protected:
      ...
    public:
      virtual returnVal funcName(void) = 0;
};

.
.
.

class AbstractParentGeneration999999999: virtual public AbstractParentGeneration999999998 {
    private:
      ...
    protected:
      ...
    public:
      virtual returnVal funcName(void) = 0;
};

class ChildGeneration: public AbstractParentGeneration999999999 {
    private:
      ...
    protected:
      ...
    public:
      returnVal funcName(void) { ... };
};
Run Code Online (Sandbox Code Playgroud)

假设程序的性质使得深度继承不能被压缩(假设它代表进化物种谱系或深度分类层次)

调用顶级抽象类时是不是存在堆栈溢出危险?

C++程序员使用哪些策略(除了"ulimit -s bytes"或折叠抽象层次结构)在系统边界内工作?

有没有办法通过RPC在多个主机系统中展平深层垂直继承层次结构?

有人设计自己的调用堆栈机制吗?

是否存在分布式网络/集群调用堆栈这样的问题?

Nic*_*las 6

很有可能,这将违反编译器的一些内部约束.如果出现问题,您将看不到运行时.

解决这个问题的一般方法是停止生成这样的代码.不要将这种数据烘焙到运行时.相反,这应该是一些文件格式,它被加载并解析为类实例的层次结构,而不是类本身.


Mik*_*our 5

调用顶级抽象类时是不是存在堆栈溢出危险?

肯定有.每个构造函数和析构函数都将调用父类中的对应项,一直到层次结构,生成一个非常深的调用堆栈.

如果它在构造中存活,那么调用虚函数就可以了 - 这只是对最终覆盖的单个函数调用.

C++程序员使用什么策略(除了ulimit -a或折叠抽象层次结构)在系统边界内工作?

就个人而言,我倾向于完全避免继承(除了抽象接口,以及我懒得很好地封装东西的情况).

在这种情况下,我可能会建议对象的运行时层次结构,可能使用函数指针来为虚函数提供类似的行为; 唯一的限制是存储它们所需的内存.它不像使用类型系统来表示您的类别那样优雅,但不太可能遇到实现限制.