2011-10-15 44 views
5
struct A{ 
    virtual void what() { cout << "Base" << endl; }; 
}; 

struct B : A { 
    virtual void what() { cout << "Sub" << endl; }; 
    int m; 
    B() : m(10) {}; 
    B(const A & x) : m(50) {}; 
}; 

void main() { 
    B b1; 
    B b2 = b1; 
    cout << "Number: " 
     << b2.m << endl; 
}; 

爲什麼不b2.m = 50?我試圖複製一個B對象,我有複製構造函數B(const A & x):m(50)。我是否需要爲派生類的屁股製作副本c'tor?像B一樣(常量B & x)??我想,因爲一個b對象具有一個部分,我們可以使用B(const的甲& X):M(50),而不是默認的構造::S拷貝構造繼承

在這種情況下,你有一個功能與參數一個A對象,你可以發送一個B對象。它如何與複製構造函數不同?

回答

14

的原因是,B(const A& x)不是一個拷貝構造函數 - 拷貝構造爲T類型必須始終把左值參考T作爲第一個(並且沒有其他非默認參數)參數。你的班級沒有定義的copy-ctor,因此編譯器會生成默認的,它會進行成員智能拷貝,因此b2.mb1.m相同。

一個非模板構造函數X類是拷貝構造函數,如果它的第一個參數是X&類型,const X&volatile X&const volatile X&的,並且無論是有沒有其他參數,否則所有其他參數默認參數(8.3 0.6)。

1

拷貝構造函數必須是同一類型的。

您還沒有真正做一個拷貝構造函數。 B(const A & x)只是一個構造函數,需要參考const A

所以,你不需要做一個派生類「以及」,但「所有」。如你所述,這種類型將是B(const B &x)

1

默認複製構造函數爲B型的類將是B(const的乙&)。既然你沒有指定這個,編譯器會爲你生成它。

及其與用戶定義的方法的那些不同,不能編譯器產生。