2017-07-16 13 views
0

以下のコードを実行すると、最初に派生クラスのオブジェクトを宣言しても、基本クラスのコンストラクタが最初に派生しているのはなぜですか。なぜ基本クラスのコンストラクタが最初に呼び出しますか?

#include<iostream> 

using namespace std; 

class base { 
    public: 
    base() 
    { cout<<"Constructing base \n"; } 
    ~base() 
    { cout<<"Destructing base \n"; } 
}; 

class derived: public base { 
    public: 
    derived() 
    { cout<<"Constructing derived \n"; } 
    ~derived() 
    { cout<<"Destructing derived \n"; } 
}; 

int main(void) 
{ 
    derived *d = new derived(); //d is defined ahead of the base class object 
    base *b = d; 
    delete b; 

    return 0; 
} 
+0

あなたは他にどんなことを期待していますか? – user0042

+2

ヒント: 'derived'の中に' base' **サブオブジェクト**があります。 – StoryTeller

+0

質問は明確ではありません。説明できますか? – MoraRockey

答えて

4

クラスderivedのすべてのオブジェクトは、クラスbaseのオブジェクトであるように、継承は、「ある-」の関係を表現しています。 derivedオブジェクトは、baseオブジェクトが行うすべてのデータとメソッド、およびderivedクラス宣言で明示的に宣言されたデータとメソッドを持っています。

Baseクラスの実装に依存するクラスDerivedを書くことは、完全に可能です(そして一般的です)。たとえば、私たちは

class Base { 
public: 
    Base() { n = 5; } 
    int GetN() const { return n; } 
private: 
    int n; 
}; 

class Derived : public Base { 
public: 
    Derived() { m = GetN() * 2; } 
    int GetM() const { return m; } 
private: 
    int m; 
}; 

があると今、私たちは

Derived* d = new Derived(); 
std::cout << d->GetM() << std::endl; 

が、それは(私の一部に間違いがなければ)行う必要があります正確に何である、10を印刷することを期待したいです。これは完全に合理的な(ちょっと人工的な)ことです。

言語は、このようなコードが正しく動作するために得ることができる唯一の方法は、タイプDerivedのオブジェクトを構築する際にDerivedコンストラクタの前にBaseコンストラクタを実行することです。 DerivedコンストラクタはBaseから継承したGetN()メソッドを呼び出すことができるため、Baseコンストラクタで適切に初期化されたデータメンバnに依存します。要約する

任意のDerivedオブジェクトを構築するときDerivedBase-であり、一般的に、それの実装とデータに依存しますので、C++は最初Baseオブジェクトとして構築する必要があります。あなたのコード内

base* b = d; 

を行うと

、あなたは変数の型であるbbaseオブジェクトへのポインタ」を宣言してからdで開催された同じメモリアドレスを使用して、この変数を初期化しています。コンパイラはすべてderivedオブジェクトARE baseのオブジェクトなので、これを行う気にしないので、dbとして扱いたいと思うかもしれません。ここではオブジェクトに実際に何も起こりませんが、ポインタ変数の宣言とインスタンス化です。 dが指し示すオブジェクトは、すべてderivedオブジェクトがベースオブジェクトであるため、すでにbaseオブジェクトでした。

この説明は意図的に少し曖昧になっていて、C++の基底クラスと派生クラスの関係について完全な説明はありません。あなたは他の記事/書籍/その標準を調べることになります。私はこれが初心者のために比較的理解しやすいことを望む。

関連する問題