如何在 c++ 中使用多态性访问派生类字段?

How to access derived class fields using polymorphism in c++?

本文关键字:派生 访问 字段 多态性 c++      更新时间:2023-10-16

我有一个简单的参数模型类,它派生自基类,如下所示:

class IParams
{
....
};
class QEParams : public IParams
{
....
};

我也有执行器类,它派生自包含 IParams 字段的基类。

class IExecutor
{
protected:
IParams parameters;
public:
virtual inline void initialize(IParams parameters) = 0;
virtual IParams& execute() = 0;
};
class QEExec : public IExecutor
{
public:
virtual void initialize(IParams parameters) override;
virtual QEParams& execute() override;
};

类 QEExec 应在参数字段中保存 QEParams。如何访问QEExec课程中的QEParams成员?我应该将参数类型转换为 QEParms 吗?

虽然我同意,你可能应该过度思考你的设计,但以下是你如何做你想做的事情:

如果希望parameters能够容纳类型为IParams和类型为QEParams的对象,则执行此操作的标准方法是使用指向基类的指针或参数。您不能让parameters具有类型IParams并期望它也适合类型QEParams的对象,因为这两个具有不同的内存布局(并且可能具有不同的大小(,因此它们必然不能位于同一位置。

这有点取决于代码的结构,以及您希望如何执行此操作。如果执行者拥有该参数,则最佳类型为std::unique_ptr<IParams>。否则,您可能希望使用IParams*IParams&std::shared_ptr<IParams>,具体取决于您如何管理此对象的生存期。要初始化的参数应为同一类型(如果使用std::unique_ptr,请使用移动语义(。

要访问QEParams' 成员,您必须使用dynamic_cast.但要非常小心。