为什么C ++ 11大括号初始化与基于堆栈的类层次结构一起工作?

时间:2015-05-05 20:50:37

标签: c++ c++11 constructor

我正在使用C ++ 11,我使用c++ -std=c++11 main.cpp在Mac OS X上成功编译了以下内容。

#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 个答案:

答案 0 :(得分:4)

  

我不明白的是ss4只是一个向量,但我能够将派生类t存储在其中。

你不是。您传递t对象,该对象用于初始化存储在向量中的s对象。请参阅对象切片。你基本上是这样做的:

s a = t{"mademouselle"};