从基指针集合转换为子类

Posted

技术标签:

【中文标题】从基指针集合转换为子类【英文标题】:Casting to subclass from a collection of base pointers 【发布时间】:2014-10-30 12:38:18 【问题描述】:

我需要建模一个服务检索器类来检索各种服务。

假设您有一个服务集合,每个服务都可以使用唯一的字符串键检索 (例如:Services.getService("render"); 应该检索索引为“render”的服务)。 现在,Service 是各种 *Service 继承类的基类,如 RenderService、InputService 等。 ,每个人都有不同的方法。

现在,这可以简单地用std::unordered_map<std::string, Service*> 建模,但它返回一个指向基类而不是派生类的指针(到目前为止,这很明显)。这意味着我不能在不进行显式转换的情况下自动调用所请求的服务的方法,我必须编写如下内容:((RenderService*)Services.at("render"))->callRenderServiceMethod();。 这是相当丑陋和多余的,因为at 方法键在逻辑上链接到RenderService

我可以通过声明来绕过这个问题:

#define CALL_RENDER ((RenderService*)Services.at("render"))

并将其用作

CALL_RENDER->callRenderServiceMethod();

虽然它看起来像一个聪明的“hack”,但这并不是解决这个问题的正确方法。

我也尝试过getService<RenderService>("render"); 之类的操作,但效果不佳,冗余问题仍然存在。

最后,我这样做是因为我想避免这种情况: class Services public: RenderService& getRenderService(); Audioservice& getAudioService(); AnotherInheritedService& getAnotherInheritedService(); private: RenderService _renderService; AudioService _audioService; AnotherInheritedService _anotherInheritedService; ;

我应该用什么样的方法来解决这种问题?

【问题讨论】:

我不确定这是否是您“应该”使用的方法,但您可以做的一件事是使用模板方法,使用 GetService(void) 方法,该方法使用在内部切换以返回适当的实例。 【参考方案1】:

根据我对问题的理解,您需要将函数声明为virtual functions。

在基类定义中声明一个虚函数并在每个派生类中实现该函数将允许根据类指针的类型调用相应类的函数。

现在,我不明白为什么您只有指向基类的指针。从逻辑上讲,您从 unordered_map 返回的指针实际上应该是派生类指针,但只是被“向上转换”到基类指针。

【讨论】:

我认为在这种情况下我不应该使用虚函数,因为继承的服务类之间没有公共接口。另外,我有指向基类的指针,因为我想让 Services 类尽可能可扩展(例如:如果我想插入新服务,我应该在 unordered_map 集合中放置一个新服务,并按名称调用它)。

以上是关于从基指针集合转换为子类的主要内容,如果未能解决你的问题,请参考以下文章

将基类指针强制转换为子类指针后的疑惑

从基类访问子类成员的首选方式

C++中子类从基类都继承啥?

强制方法从基类调用子类新方法

是否可以从父类指针向下转换为第二个子类中的子类指针?

如何从基类实例中找出子类?