[英]About C++ types, and vectors
假設我有幾節課
Alpha類(基類)
Beta類(子類Alpha)
Delta類(子類Alpha)
是否可以在該vector<Alpha>
創建vector<Alpha>
並存儲Alpha,Beta和Delta類型的對象實例,並使向量函數正常?
如果沒有,假設我想擁有某種類似的功能,那么最好的方法是什么?
一種方法是使一個帶有指針的向量,並使每個指針共有的函數在基類中是virtual
的:
class Alpha {
public:
virtual void dosomething() { /* do something as an alpha */ }
};
class Beta : public Alpha {
public:
void dosomething() { /* do something as a beta */ }
};
class Delta : public Alpha {
public:
void dosomething() { /* do something as a delta */ }
};
vector<Alpha*> v;
v.push_back(new Alpha);
v.push_back(new Beta);
v.push_back(new Delta);
v[1]->dosomething(); // calls Beta's dosomething
但是,您必須小心這種方法,以確保並delete
您要放入容器的new
內容。 你可以使用智能指針避免這個警告:
vector<shared_ptr<Alpha> > v;
v.push_back(shared_ptr<Alpha>(new Alpha));
v.push_back(shared_ptr<Alpha>(new Beta));
v.push_back(shared_ptr<Alpha>(new Delta));
v[1]->dosomething(); // still calls Beta's dosomething
你不想擁有Alpha
的矢量(而不是Alpha*
s,這是正常的)的原因是因為STL容器復制你給它們的值,如果你將Beta
(或Delta
)復制為Alpha
,只會調用Alpha
的復制構造函數,結果信息必須符合Alpha
的大小(如果你已經向子類中添加了任何信息,那么它將不夠大),以及Beta
的額外信息(或Delta
)失去了。 這稱為切片。
最好的方法是將智能指針存儲到向量中的類。
你不能通過值傳遞,因為你隨后切片。
如果通過引用傳遞,則變量可能超出范圍。
std::vector<shared_ptr<Alpha> > blah;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.