Действительно ли возможно возвратить абстрактный класс (сам класс или ссылка, не имеет значения) от функции?
Вы можете вернуть указатель абстрактного класса - предполагая, что B
является конкретным классом, производным от абстрактного класса A
:
A * f() {
return new B;
}
или ссылка:
A & f() {
static B b;
return b;
}
или интеллектуальный указатель:
std::unique_ptr<A> f() {
return std::make_unique<B>(...);
}
Абстрактные классы не могут быть созданы и, следовательно, не возвращены.
Вы можете объявить возвращаемый тип как ссылку или указатель на абстрактный класс, чтобы его можно было назначить ссылкам или указателям на абстрактный класс и использовать на основе на его интерфейсе.
Однако вы не можете вернуть фактический экземпляр фактического абстрактного класса , потому что по определению вы не можете его создать. Однако вы можете возвращать экземпляры конкретных подтипов, что достаточно хорошо, потому что по принципу подстановки вы всегда должны иметь возможность использовать подтип вместо супертипа.
Шаблон проектирования 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;
}
Фактический объект абстрактного базового класса никогда не может быть возвращен, поскольку никогда не может быть экземпляра абстрактного базового класса. Указатели и ссылки на абстрактный базовый тип могут быть возвращены, как в приведенном выше примере.
Указатели и ссылки на абстрактный базовый класс, возвращаемые функцией или методом, на самом деле относятся к потомку абстрактного базового типа.
Нет, но функция может иметь возвращаемый тип указателя (или ссылки) на абстрактный класс. Затем она будет возвращать экземпляры класса, производного от абстрактного класса.