2011-09-14 14 views
1
class base { 
public: 
    base(){ 
     cout << "base constructor" << endl; 
    } 
    base(const base& rh) { 
     cout << "base copy constructor" << endl; 
    } 
}; 

//case 1: 
class der : public base { 
}; 

//case 2: 
class der : public base { 
public: 
    der(){ 
     cout << "der constructor" << endl; 
    } 
    der(const der& rh) { 
     cout << "der copy constructor" << endl; 
    } 
}; 

int main() { 
der d; 
der d1(d); 
} 

ケース1:der d1(d);呼び出しコピーコンストラクタのロジック

case-2では、ベースクラスのデフォルトのコンストラクタとderクラスのコピーコンストラクタ が呼び出されます。

ロジックを説明できる人はいますか?

答えて

3

ケース1では、コンパイラによって合成されたデフォルトのコピーコンストラクタを取得します。これは、ベースとメンバーをコピーするために定義されています。

ケース2の場合、独自のコピーコンストラクタが定義されています。このコンストラクタは、実行するように指示します。基本クラスの初期化子リストには何も入れなかったので、基底は明示的に基底を初期化しない他のコンストラクタと同じ、default-construct [*]です。 derにデータメンバーがあった場合でも、コピーされません。

[*]またはPOD以外のクラスで同じものになる他の種類の初期化の1つ。私はそれらの詳細を覚えていない。最初のケースでは、あなたがderのコンストラクタを指定していない

0

は、したがって、コンパイラはあなたのために決定し、それはプロセスでbaseのコピーコンストラクタを呼び出し、個別d1dのデータをコピーです。

2番目のケースでは、自分でbaseのコピーコンストラクタを呼び出さないコピーコンストラクタを指定しました。 derのコピーコンストラクタをオーバーライドしたので、コンパイラはにコピーすると、baseのコピーコンストラクタも呼び出すことはできません。

0

基本的に1つのcopy-conへの呼び出しがあります。したがって、ケース2の場合、derのコピーが呼び出され、好きな場合は、コードのベースのcopy-conを使用できます。ケース1では、コピーコンディションを実装していないので、基底クラスでのみ実装されている関数と同様に、基底から関数を呼び出します。

2

派生コピーコンストラクタは、デフォルトでは基本クラスコピーコンストラクタ自体を呼び出しません。派生クラスのコピーコンストラクタに基本クラスのコピーコンストラクタを呼び出さないように指示すると、ベースのサブオブジェクトを構築する必要があるため、基本のデフォルトコンストラクタを呼び出す必要があります。

しかし、以下の例では、あなたが明示的に派生クラスのメンバinitilizeリストのベースコピーコンストラクタに呼び出して追加することができます表示されます。

class base { 
public: 
    base(int i):m_i(i){ 
     cout << "base constructor" << endl; 
    } 
    base(const base& rh) { 
     m_i = rh.m_i; 
     cout << "base copy constructor" << endl; 
    } 
private: 
int m_i; 
}; 

//case 2: 
class der : public base { 
public: 
    der(int i,int j):base(i),m_j(j){ 
     cout << "der constructor" << endl; 
    } 
    der(const der& rh):base(rh) { 
     m_j = rh.m_j; 
     cout << "der copy constructor" << endl; 
    } 
private: 
    int m_j; 
}; 

int main() { 
der d(1,2); 
der d1(d); //d1.m_i = 1, d1.m_j = 2 
} 

//result 
//base copy constructor 
//der copy constructor 
関連する問題