2017-10-23 8 views
-2

私のプログラムはクラッシュの原因を示すことなく、突然停止します。私がしようとしているのは、(継承を介して)派生クラスのクラスメンバーを使用することです逆:実行時にプログラムがクラッシュする

#include <iostream> 

using namespace std; 

class Base 
{ 
public: 
    void attribBase(); 
}; 

class Derived : public Base 
{ 
public: 
    void attribDerived(); 
}; 

void Base::attribBase() 
} 
    Derived d; 
    d.attribDerived(); 
} 

void Derived::attribDerived() 
{ 
    Base b; 
    b.attribBase(); 
} 

int main() 
{ 
    Base b; 
    Derived d; 

    b.attribBase(); 
    d.attribDerived(); 

    return 0; 
} 
+0

無限の再帰があります。 'attribDerived()'は 'attribDerived()'を呼び出す 'attribBase()'を呼び出します。 – Barmar

+0

'b.attribBase();'作成する 'b.attribBase();'を呼び出すBaseオブジェクトを作成する 'd.attribDerived();'を呼び出すDerivedオブジェクトを作成します....無限再帰 – Amadeus

+1

本当にすべきですコードをインデントします。編集ウィンドウの左の余白に対してフラッシュされたすべてを書き込むときに、クラスまたは関数の開始位置と終了位置を確認するのは難しいです。 – PaulMcKenzie

答えて

0

プログラムには無限回帰があります。 そのため、スタックオーバーフローが発生しました。 プロセスが終了します。

無限関数呼び出しを中断します。

-1

問題は無限ループです。 attribDerived()関数はattribBase()関数を呼び出し、attribBase()はattribDerived()を呼び出し、attribDerived()はattribBase()を呼び出します。関数はループを停止する条件なしで互いに呼び出しています。

コンパイラによっては、構文と論理エラーがないため、エラーは発生していません。ループは機能しますが、何も役に立ちません。

また、attribDervied()関数がattribBase()関数のBaseクラスを呼び出していると考えているという印象を、あなたは「逆もまた同じです。ただし、継承とは、DerivedクラスがBaseクラスのすべてのコピーを取得することを意味します。 attribDerived()は、attribBase()のクラス外の関数を検索していません。したがって、attribDerived()は兄弟関数(DerivedクラスのattribBase())を呼び出すだけです。

これはあなたの問題を明確にしたいと考えています:)

関連する問題