繁体   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