Чисто-виртуальный класс может использоваться как тип возвращаемого значения, если вы используете только ссылку или указатель.
Фактически, в Java Interface foo = Implementer();
эквивалентно Interface* foo = Implementer();
, а implements Foo
равно public virtual Foo
.
Вот пример Java:
interface Foo {
public void doFoo();
}
class Bar implements Foo {
public void doFoo() { }
}
Его аналог C ++:
struct Foo {
virtual void doFoo() = 0;
virtual ~Foo() { }
};
class Bar : public virtual Foo {
public:
virtual void doFoo() { }
virtual ~Bar() { }
};
Правильно, C ++ будет жаловаться на неполный тип, если вы используете Foo foo;
. Использование Foo& foo
, Foo* foo
или smart_pointer<Foo> foo
- это то, что требуется.
В этом примере smart_pointer
может быть scoped_ptr
, unique_ptr
или shared_ptr
, в зависимости от того, хотите ли вы
- просто умный указатель, который
delete()s
на уничтожение
- умный указатель с семантикой перемещения
- умный указатель, который делает подсчет ссылок
Обратите внимание, что для повышения интеллектуальных указателей, если вы их используете, используйте семантику get()
/ reset()
для получения и установки значения указателя.