C++ c++;基类被调用但返回派生类

C++ c++;基类被调用但返回派生类,c++,design-patterns,c++98,C++,Design Patterns,C++98,首先,我被C++98束缚住了,我多么希望我们的供应商(以及他们的供应商)能够更新 我正在使用一个第三方框架,我确实从中获得了资源。我不想改变来源,以确保我向上和向下兼容 该框架有一个基类通道和派生类数字和模拟 class Channel { getChannel(std::string chName) { //returns a Channel } bool IsDigital() { //returns true for

首先,我被C++98束缚住了,我多么希望我们的供应商(以及他们的供应商)能够更新

我正在使用一个第三方框架,我确实从中获得了资源。我不想改变来源,以确保我向上和向下兼容

该框架有一个基类<代码>通道<代码>和派生类<代码>数字<代码>和<代码>模拟<代码>

class Channel
{
    getChannel(std::string chName)
    {
        //returns a Channel  
    }
    bool IsDigital()
    {
       //returns true for digital otherwise false
    }
}

class Digital : public Channel
{
    // functionality for Digital
}

class Analog : public Channel
{
    // functionality for Analog
}
基类允许我通过调用
getChannel(std::string chName)
方法来查找“通道”。基类还有一个方法
IsDigital()
。当通道为数字时,该方法返回true,否则为模拟

是否有一种方法(或模式)可以用于从基类请求通道并返回
数字
模拟
(派生类)?如果我需要在两者之间构建类来完成它,这对我来说是可以的。我想避免在节目中获得频道,并将其转换成多个变量,从而导致负载

Digital* d;
Analog*  a;
Channel* c;

c = framework->getChannel("name");
if (c->IsDigital())
{
   d = dynamic_cast<Digital>(c);       
}
else
{
   a = dynamic_cast<Analog>(c);       
}

您可以使用函数模板来实现这一点

namespace MyApp
{
    template <typename T>
    T* getChannel(Framework* framework, std::string const& cname)
    {
       return dynamic_cast<T*>(framework->getChannel(cname));
    }
}
名称空间MyApp
{
模板
T*getChannel(框架*Framework,std::string const&cname)
{
返回动态_cast(framework->getChannel(cname));
}
}
和使用

Analog*  a = MyApp::getChannel<Analog>(framework, "name");
模拟*a=MyApp::getChannel(框架,“名称”);
您似乎在询问工厂模式-您关于理想目标的示例非常不清楚。还有,什么是框架?(我猜它是一个通道基对象)。你确定必须强制转换getChannel的结果吗?NeButValfAfAK我从工厂模式中得到一个通道对象,而我想拥有一个数字或模拟对象。@ CAPATIGIRAFRAE框架是一个定制的C++框架,为其硬件提供功能。我试图更好地解释我想要实现的目标。是否有可能拥有另一个类,例如可以表现为线模拟或数字的
MyIO
,以便
MyIO*a=MyApp::getChannel(framework,“name1”);MyIO*d=MyApp::getChannel(框架,“名称2”)@barts,当然有可能。
MyIO
和其他类之间的关系是什么?
MyIO
是一个我仍然需要创建的类,因此我可以以任何需要的方式将其与通道、数字和/或模拟类关联,但是我不能更改通道、数字和模拟类。
Analog*  a = MyApp::getChannel<Analog>(framework, "name");