如何在 c++ 中使用多态性访问派生类字段?
How to access derived class fields using polymorphism in c++?
我有一个简单的参数模型类,它派生自基类,如下所示:
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
.但要非常小心。
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 为什么此派生对象无法访问基类的后递减方法?
- C++:为什么无法在派生类中访问受保护的构造函数?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- 按基类对象访问派生类资源时出错
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 从模板化父类中的派生内部类访问受保护的成员变量
- 如何从派生类访问基类中的重载运算符?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- C++11: 如何访问派生类中的基类成员?
- 访问派生类的 QMetaObject
- 使用基类对象访问派生的仅类方法
- 如何在 c++ 中通过基类引用访问派生类的对象?
- 派生类无法访问基类的受保护成员
- 如何在 c++ 中使用多态性访问派生类字段?
- 为了访问方法,从基类动态转换为派生类
- C++继承从基类指针访问派生类中的非虚拟函数