我有這兩個類:vector.push_back(B)和vector.push_back(new A((* B))),爲什麼行爲不一樣?
class A
{
public:
A();
virtual ~A();
virtual void TellMyName();
};
class B : public A
{
private:
std::string szName;
public:
B();
~B();
void TellMyName();
void SetName(std::string val){ szName = val; }
};
這是我的代碼:
void main()
{
std::vector<A*> List_A;
B* B_Instance = new B();
B_Instance->SetName("B");
List_A.push_back(B_Instance); // Way 1
List_A.push_back(new A((*B_Instance))); // Way 2
List_A[0]->TellMyName();
List_A[1]->TellMyName();
}
TellMyName()
只是要提示消息框。如果我使用「方式1」,它沒有問題,但如果我使用「方式2」,它會提示沒有文本的消息,這意味着B類的所有成員都是空的,就像他們從未被任何東西填充。我通過使用std::shared_ptr
解決了這個問題,但有沒有其他方法可以不使用智能指針,因爲我必須在一個大項目中實現這個方法,並且會有很多變化和失敗。順便說一下,「方式2」的原因是什麼?
閱讀*對象切片*。 – juanchopanza
http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c –
謝謝!我並沒有真正瞭解切片的事情。 – MahanGM