2013-04-02 127 views
5

我正在用C++ 11智能指針重寫一個應用程序。C++ 11智能指針和多態性

我有一個基類:

class A {}; 

而派生類:

class B : public A { 
    public: 
    int b; 
}; 

我有包含與A或B的對象的載體另一個類:

class C { 
    public: 
    vector<shared_ptr<A>> v; 
}; 

我用A(基類)對象構造C沒有問題,但是如何用B(派生類)對象填充它?

我想這一點:

for(int i = 0; i < 10; i++) { 
    v.push_back(make_shared<B>()); 
    v.back()->b = 1; 
}; 

,編譯器返回: 錯誤: 'A級' 沒有名爲 'B'

+0

你在做什麼?聽起來像將A看作多態是一個錯誤的想法,因爲你不會使用它。 –

+2

這不是關於智能指針,而是錯誤地使用多態。用虛函數替換public b成員(可能是get和set函數)。 –

+0

我簡化了類。在他們的真實形式中,多態是有意義的。 –

回答

10

But how can I fill it with B (derived class) objects?

你加油吧成員(指向)B對象。但是,指針的靜態類型指的是基類A,所以不能直接使用它們來訪問派生類的任何成員。

在您簡單的例子,你可以簡單地保持一個指針保持到B和使用:

std::shared_ptr<B> b = make_shared<B>(); 
b->b = 1; 
v.push_back(b); 

如果您沒有訪問原始指針,那麼你將需要某種形式的多態性:

  • 使用static_cast<B*>(v.back().get())如果你知道所有的對象都具有類型B
  • 使用虛擬函數或dynamic_cast(它要求基類包含一個虛函數才能工作)如果對象可能有不同的類型
3
for(int i = 0; i < 10; i++) { 
    auto bptr = make_shared<B>(); 
    v.push_back(bptr); 
    bptr->b = 1; 
}; 
+1

謝謝你的回答。這是正確的,但邁克西摩的解釋幫助我理解了爲什麼。 –