Базовый класс C++ вызван, но возвращает производный класс

Прежде всего, я связан с C++98, как я хотел бы, чтобы наш поставщик (и их поставщик) обновлялся

Я работаю со сторонним фреймворком, из которого у меня есть источники. Я не хочу менять источники, чтобы удостовериться, что я совместим вверх и вниз.

Эта структура имеет базовый класс Channel и производные классы Digital а также Analog

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 или же Analog (производный класс)? Если мне нужно построить классы между ними, это нормально для меня. Я хотел бы предотвратить загрузку каналов в программе, их приведение и множественные переменные.

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

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

Я надеюсь, что есть что-то подобное. В моем основном коде я использую свой класс IO и вспомогательный класс, где вспомогательный класс работает с платформой, чтобы определить, является ли это цифровым или аналоговым каналом, а класс IO может быть цифровым или аналоговым.

MyInBetweenClass* helper;
MyOwnClass *ioD;
MyOwnClass *ioA;

ioD = helper(framework->getChannel("digitalname"));
ioA = helper(framework->getChannel("analogname"));

// here do something with ioD acting on the digital IO
//   or do something with ioA acting on the analog IO

1 ответ

Вы можете сделать это, используя шаблон функции.

namespace MyApp
{
    template <typename T>
    T* getChannel(Framework* framework, std::string const& cname)
    {
       return dynamic_cast<T*>(framework->getChannel(cname));
    }
}

и использовать

Analog*  a = MyApp::getChannel<Analog>(framework, "name");
Другие вопросы по тегам