2015-05-05 36 views
1

我在玩C++ 11,我已經在Mac OS X上使用c++ -std=c++11 main.cpp成功編譯了以下代碼。爲什麼C++ 11支持初始化使用基於堆棧的類層次結構?

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 


class s { 
public: 
    s(const string& str) : value {str} {} 
    string value; 
}; 

class t : public s 
{ 
public: 
    t(const string& str) : s{"t: " + str} {} 
}; 

int main(int argc, const char** argv) { 

    vector<s*> ss1 
    { 
     new s { "hello" }, 
     new s { "there" } 
    }; 

    vector<s> ss2 
    { 
     s { "greeting" }, 
     s { "father" } 
    }; 

    vector<s> ss3 
    { 
     { "ahoy" }, 
     { "matey" } 
    }; 

    vector<s> ss4 
    { 
     { "bonjour" }, 
     t { "mademouselle" } 
    }; 

    for (auto &s : ss1) { 
     cout << "value: " << s->value << std::endl; 
    } 

    for (auto &s : ss2) { 
     cout << "value: " << s.value << std::endl; 
    } 

    for (auto &s : ss3) { 
     cout << "value: " << s.value << std::endl; 
    } 

    for (auto &s : ss4) { 
     cout << "value: " << s.value << std::endl; 
    } 

}; 

輸出是在這裏:

value: hello 
value: there 
value: greeting 
value: father 
value: ahoy 
value: matey 
value: bonjour 
value: t: mademouselle 

,我不明白的事情是,ss4僅僅是一個vector<s>,可是我能夠派生類t存儲在它的內部。這怎麼可能?

+1

我不確定這是否真的是重複的。這個問題有兩個部分,第一個部分是派生類型可能被分配給基類型的重複部分。但是在標題中還有另一個:*爲什麼C++ 11支持初始化使用基於堆棧的類層次結構?* - 在使用std :: initializer_list構造函數時應該編譯代碼嗎? –

回答

4

我不明白的是ss4只是一個向量,但我能夠將派生類t存儲在其中。

你不是。您傳遞一個t對象,該對象用於初始化存儲在向量中的s對象。請參閱對象切片。你基本上是這樣做的:

s a = t{"mademouselle"};