2013-06-25 43 views
0

我有一些基本問題需要理解將派生對象存儲到C++基類型容器中的行爲。將派生對象存儲到基類型容器中

任何人都可以解釋下面的代碼的輸出?我認爲這兩種功能的行爲應該是一樣的。

// Output 
test_func1 
UseCount: 1 
UseCount: 2 
test_func2 
UseCount: 1 
UseCount: 1 // Why??? 
class base_class 
{ 
public: 
    base_class() { } 
    virtual ~base_class() { } 
}; 

class derived_class : public base_class 
{ 
public: 
    derived_class(const std::shared_ptr<int>& i) 
     : base_class(), 
      i_(i) 
    { } 

    ~derived_class() { } 

private: 
    std::shared_ptr<int> i_; 
}; 

void test_func1() 
{ 
    std::cout << "test_func1" << std::endl; 
    std::vector<derived_class> v; 
    std::shared_ptr<int> i(new int(100)); 
    std::cout << "UseCount: " << i.use_count() << std::endl; 
    v.push_back(derived_class(i)); 
    std::cout << "UseCount: " << i.use_count() << std::endl; 
} 

void test_func2() 
{ 
    std::cout << "test_func2" << std::endl; 
    std::vector<base_class> v; 
    std::shared_ptr<int> i(new int(100)); 
    std::cout << "UseCount: " << i.use_count() << std::endl; 
    v.push_back(derived_class(i)); 
    std::cout << "UseCount: " << i.use_count() << std::endl; 
} 

int main(int argc, char *argv[]) 
{ 
    test_func1(); 
    test_func2(); 
    return 0; 
} 
+1

閱讀[object slicing](http://en.wikipedia.org/wiki/Object_slicing)。 – juanchopanza

+0

謝謝。這是我第一次聽到這個詞... – alex

回答

0

因爲在第二種情況下的基礎類是從傳遞給push_back方法派生類拷貝構造。而你的基類不存儲shared_ptr<int>。返回push_back之後,派生類實例被銷燬。

void test_func2() 
{ 
    std::cout << "test_func2" << std::endl; 
    std::vector<base_class> v; 
    std::shared_ptr<int> i(new int(100)); //use count is 1 
    std::cout << "UseCount: " << i.use_count() << std::endl; 
    v.push_back(derived_class(i)); //base_class is copy constructed here and store in v 
    //derived_class() is destroyed ans use count is still 1 
    std::cout << "UseCount: " << i.use_count() << std::endl; 
} 
1

不能儲存器獲得對象的std ::基類的載體。試着記住這一點。

該矢量存儲基類,沒有別的。在push_back上,派生的部分被切掉。

如果你想有一個多態的集合,看看如何做到這一點,'多態STL集合'是SO或一般的好查詢。

+0

謝謝。我很愚蠢 – alex

相關問題