我学会了通过存储基类指针将派生类指针存储在基类向量中:
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;
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]));
只需添加上面的循环即可。重点是您可以投射到接口*
,这就是您的矢量
只需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在一个应该在边