возврат абстрактного класса от функции

Действительно ли возможно возвратить абстрактный класс (сам класс или ссылка, не имеет значения) от функции?

27
задан cemregoksu 18 May 2010 в 21:27
поделиться

5 ответов

Вы можете вернуть указатель абстрактного класса - предполагая, что B является конкретным классом, производным от абстрактного класса A :

A * f() {
    return new B;
}

или ссылка:

A & f() {
    static B b;
    return b;
}

или интеллектуальный указатель:

std::unique_ptr<A> f() {
    return std::make_unique<B>(...);
}
37
ответ дан 28 November 2019 в 04:56
поделиться

Абстрактные классы не могут быть созданы и, следовательно, не возвращены.

3
ответ дан 28 November 2019 в 04:56
поделиться

Вы можете объявить возвращаемый тип как ссылку или указатель на абстрактный класс, чтобы его можно было назначить ссылкам или указателям на абстрактный класс и использовать на основе на его интерфейсе.

Однако вы не можете вернуть фактический экземпляр фактического абстрактного класса , потому что по определению вы не можете его создать. Однако вы можете возвращать экземпляры конкретных подтипов, что достаточно хорошо, потому что по принципу подстановки вы всегда должны иметь возможность использовать подтип вместо супертипа.

16
ответ дан 28 November 2019 в 04:56
поделиться

Шаблон проектирования Factory является примером возврата указателя на объект абстрактного класса:

class Base
{ ; }

class One : public Base
{ ; }

class Two : public Base
{ ; }

Base * Factory(unsigned int number)
{
  Base * p_item(NULL);
  switch (number)
  {
    case 1:
      p_item = new One;
      break;
    case 2:
      p_item = new Two;
      break;
    default:
      p_item = NULL;
      break;
  }
  return p_item;
}

Фактический объект абстрактного базового класса никогда не может быть возвращен, поскольку никогда не может быть экземпляра абстрактного базового класса. Указатели и ссылки на абстрактный базовый тип могут быть возвращены, как в приведенном выше примере.

Указатели и ссылки на абстрактный базовый класс, возвращаемые функцией или методом, на самом деле относятся к потомку абстрактного базового типа.

1
ответ дан 28 November 2019 в 04:56
поделиться

Нет, но функция может иметь возвращаемый тип указателя (или ссылки) на абстрактный класс. Затем она будет возвращать экземпляры класса, производного от абстрактного класса.

4
ответ дан 28 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: