簡體   English   中英

將抽象派生類對象存儲在基類向量中

[英]Store abstract derived class objects in base class vector

我已經學會了通過存儲基類指針將派生類指針存儲在基類向量中:

vector<base*> base_vector;
base_vector.push_back(new derived());
// free memory at the end

但是如果我有一個抽象基類:

class interface {
public:
    virtual interface(){} 
    virtual ~interface(){}
};

從中派生出另外兩個抽象類。

class abstract_derived_1 : virtual public interface 
{ 
public:
    virtual abstract_derived_1(){} 
    virtual ~abstract_derived_1(){}
};

class abstract_derived_2 : virtual public interface 
{ 
public:
    virtual abstract_derived_2(){} 
    virtual ~abstract_derived_2(){}
};

以及來自次要抽象類的其他幾個派生類:

class derived_1 : virtual public interface, virtual public abstract_derived_1
{
private:
    double value;
public:
    derived_1(){value=0;}
    derived_1(const double val1, const double val2) { value = val1+val2; }
    ~derived_1(){}
};


class derived_2 : virtual public interface, virtual public abstract_derived_2
{
private:
    string name;
public:
    derived_2(){name="";}
    derived_2(string my_str) { name = my_str; }
};

是否可以將它們全部存儲在多態向量中? 和往常一樣,我做了以下工作:

vector<abstract_derived_1*> abs1;
vector<abstract_derived_2*> abs2;
abs1.push_back(new derived_1(1,2));
abs2.push_back(new derived_2("polymorphism"));

但是如何將兩個多態向量存儲在基類向量中?

vector</* What should I put in here? */> interface_vector;

只需將新derived_1derived_2實例derived_2回通用向量vector<interface*>就沒有問題,因為它們具有interface類作為祖先。

順便說一句:您無需從interface再次繼承derived_1類和derived_2類。 這是罕見的,我很確定這可能會導致其他問題。

vector<interface*> interface_vector;
// Loop through abs1 with an index of i
interface_vector.push_back(dynamic_cast<interface*>(abs1[i]));
// Loop through abs2 with an index of i
interface_vector.push_back(dynamic_cast<interface*>(abs2[i]));

只需在上面添加循環即可。 主要的一點是,你可以轉換為interface*這就是你的vector<interface*>的期望。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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