Базовый класс 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");