2013-03-13 88 views
2
// Use multiple inheritance. We want 
// both a string and an Object: 
class MyString: public string, public Object { 
public: 
    ~MyString() { 
    cout << "deleting string: " << *this << endl; 
    } 
    MyString(string s) : string(s) {} 
}; 

對於上面的代碼,我不明白什麼string(s)是什麼意思?實際上並沒有稱爲string的變量,但爲什麼它可以工作?這個初始化器列表是什麼意思?

+0

[在構造函數中這個奇怪的冒號成員語法是什麼?](http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the -constructor) – 2013-03-13 14:51:17

+0

這不是重複的。您鏈接的問題是關於成員初始化,在這種情況下,調用基類構造函數。正如OP提到的那樣,沒有成員稱爲字符串。 – JSQuareD 2013-03-13 15:04:47

+1

只是說,你可能不想從'string'派生。 – 2013-03-13 15:11:52

回答

3

通常,在構造派生類時,將調用默認的基礎構造函數(如果存在)。如果你想爲某個派生構造函數顯式調用不同的基類構造函數,可以使用初始值設定項列表來完成。

在這種情況下,構建MyString時,所述string -constructor這需要一個string作爲其唯一參數(複製構造),將與s作爲參數調用。

+0

我似乎隱約記得它是一個C++ 11功能。是否合適?有沒有一個特定的術語(除了「初始化列表」,通常是指初始化字段)? – 2013-03-13 16:18:36

+0

據我所知,這是調用基礎構造函數的唯一方法,並且已經存在很長一段時間了。我認爲你所記住的是,所有成員的初始化現在都必須在構造函數中完成(初始化列表或主體,而不是在聲明中,如'int member = 3')。 – JSQuareD 2013-03-13 16:20:51

2

string(s)正在用s構造MyString的父類實例。

請注意,MyString繼承自string,這就是使用string所指的。

這被稱爲「初始化器列表」。

1

它初始化string類型的父子對象。實際上,它指定要調用父親的父親構造函數。

1

MyString派生自string。您引用的語法string(s)s作爲唯一參數調用基類構造方法。