Я хотел бы принудительно установить определенный API для всех классов, производных от базового класса. Обычно вы делаете это с использованием абстрактного базового класса, который имеет чисто виртуальные функции. Однако как вы обрабатываете функции, возвращающие производный тип? Как мне заставить форматировать этот тип функции?Абстрактный базовый класс для производных классов с функциями, возвращающими тип производного класса
struct base
{
virtual base func() = 0;
};
struct deriv1 : base
{
deriv1 func();
};
struct deriv2 : base
{
deriv2 func();
};
В этом примере будет приведена ошибка, например, «неверный абстрактный тип возврата для функции-члена». Я видел несколько ответов, которые предлагают возвращать указатели, но я не особенно хочу окунуться в динамическую память для этого, и отслеживание всех выделенных указателей будет особым видом ада. Есть идеи?
Я не уверен, что вы хотите сделать. Почему вы возвращаете типы по стоимости? Можете ли вы назвать функции реалистичными именами? Обычно при клонировании обычно возвращается ссылка или указатель на производный тип. Если управление памятью вызывает беспокойство, верните умный указатель (например, google shared_ptr). –
В принципе, я никогда не хочу использовать базу или даже полиморфизм. Я просто хочу создать API, чтобы гарантировать, что любой класс, полученный из базы, может работать в одних и тех же ситуациях. В принципе, способ сказать: «Если вы хотите заменить производный 1 на производный код в вашем коде, вам необходимо реализовать эти функции». Это единственный случай для этого. –
И этот конкретный случай использования не стоит проблем или ударов с помощью интеллектуальных указателей и динамической памяти. –