当前位置: 首页 > 知识库问答 >
问题:

将抽象派生类对象存储在基类向量中

宁锐
2023-03-14

我学会了通过存储基类指针将派生类指针存储在基类向量中:

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;

共有2个答案

郎长卿
2023-03-14
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]));

只需添加上面的循环即可。重点是您可以投射到接口*,这就是您的矢量

韦德厚
2023-03-14

只需push_back新的derived_1实例并derived_2通用向量没有问题

顺便说一下:不需要< code>derived_1类和< code>derived_2类再次从< code>interface继承。这是不常见的,我很肯定这可能会导致其他问题。

 类似资料:
  • 尽管派生类对象也是基类对象,但是派生类类型和基类类型是不同的。在 public 继承中,派生类对象能作为基类对象处理。由于派生类具有对应每个基类成员的成员(派生类的成员通常比基类的成员多),所以把派生类的对象赋给基类对象是合理的。但是,反过来赋值会使派生类中基类不具有的成员没有定义,所以这是不允许的。尽管如此,提供正确的重载赋值运算符和(或)转换构造函数可以允许这种操作(见第8章)。 常见编程错误

  • 嗨,我正在尝试使用抽象类在 laravel 中实现存储库模式,以拥有一些我新手的基本功能。 我正在得到 分析错误:语法错误,意外'- 在AbstractRepository一行- AbstractRepository.php ReportRepositoryInterface.php ReportRepository.php ReportsController.php 有谁能开导一下吗?谢谢

  • 抽象路由类 aiohttp使用抽象类来管理web接口。 aiohttp.web中大部分类都不打算是可以继承的,只有几个是可以继承的。 aiohttp.web建立在这几个概念之上: 应用(application),路由(router),请求(request)和响应(response)。 路由(router)是一个可插拔的部分: 用户可以从头开始创建一个新的路由库,不过其他的部分必须与这个新路由无缝契

  • 我仍然试图掌握抽象基类的概念,以及从派生类中可以做什么和不能做什么。 我有以下代码: 基类中的示例- 在派生类中

  • How ABCs Work # abc_base.py import abc class PluginBase(metaclass=abc.ABCMeta): @abc.abstractmethod def load(self, input): """Retrieve data from the input source and return

  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边