簡體   English   中英

關於C ++類型和向量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM