FYI, в дополнение к решению @SidS, мы также можем извлечь процесс генерации в виде простой функции, которая возвращает указатель Base
следующим образом.Здесь я также использую std::unique_ptr
, что делает наш код более безопасным с семантикой RAII, и тогда вы можете опустить вызов delete b
:
#include <stdexcept>
#include <memory>
std::unique_ptr<Base> create(int i) // C++11
{
switch(i)
{
case 1:
return std::make_unique<Derived1>(); // C++14
break;
case 2:
return std::make_unique<Derived2>();
break;
default:
throw std::logic_error("unsupported.");
}
}
Тогда сторона вызова будет более простой, как показано ниже:
DEMO
auto b = create(i);
b->generate();
b->other();