2012-10-26 122 views
0

代碼:C++是什麼Derived默認拷貝構造函數初始化Base拷貝構造函數用?

#include<iostream> 
using namespace std; 

class B{ 
    public: 
    int b; 
    B(int x):b(x){ 
     cout << "B() Constructor " << endl;} 
    B(const B& m):b(m.b){ 
     cout << "B(const B&) copy constructor "<< endl;} 
}; 


class D:public B{ 
    public: 
    D(int x):B(x){ 
     cout << "D() Constructor " << endl;} 
    D(const D& n):B(n){ // at this point n should be casted to B object !!? 
     cout << "D(const D&) copy constructor " << endl;} 
    operator B(){ 
     cout << "operator B" << endl; 
     return B(this->b);} 

}; 

int main(){ 

D ob(1); 
cout << "---" << endl; 
D oc=ob; 
} 

輸出:

B() Constructor 
D() Constructor 
--- 
B(const B&) copy constructor 
D(const D&) copy constructor 

問題:

1)如果我不提供我的D拷貝常數ructor,D的默認拷貝構造函數必須通過調用B拷貝構造函數來初始化Base對象。我的問題是B的複製構造函數將採用什麼參數?它是一個D對象,然後它將被鑄造到一個B對象?

2)在D拷貝構造函數,我初始化BD對象n,也沒有呼叫到operator B()這證明對象D類型的n沒有得到鑄造到B,所以可以作爲參數傳遞給B拷貝構造函數。有沒有解釋這種行爲?

回答

4

首先,一個轉換是你在你的代碼中寫的東西,以告訴編譯器做一個轉換。有兩類轉換:隱式和顯式。隱式轉換將在需要時完成,無需轉換。顯式轉換需要強制轉換。你在這裏討論的是隱式轉換,而不是演員。

答案是,從引用到派生類型到對基類型的引用存在隱式轉換。就是這麼簡單:n是一個D &,它可以通過隱式轉換它的類型傳遞給一個只需要B &的函數。