Вы также можете вернуть объект по значению.
Некоторые компиляторы предоставляют Оптимизацию возвращаемого значения , которая оптимизирует удаление копии при возврате объекта.
Edit:
Сожалею. Я пролистал вопрос и почему-то упустил тот факт, что наследование связано. Предполагая, что getBar () может возвращать различные виды IBar, возвращающие указатель IBar , имеет большой смысл.
Возвращая указатель на базу , конкретный объект сохраняется. Устранена проблема среза , и имеется исходный указатель vtbl для выполнения вызовов виртуальных функций. Также (как вы отметили в своем комментарии) вернуть экземпляр абстрактного класса просто невозможно.
Вместо того, чтобы возвращать необработанный указатель, я предлагаю вам вернуть shared_ptr<IBar>
, чтобы упростить управление памятью.
const shared_ptr<IBar> Foo::getBar()
{
shared_ptr<IBar> ret(new Bar());
return ret;
}
Тогда используйте это так:
shared_ptr<IBar> pIBar(foo.getBar());
pIBar->myVirtualFunction();
shared_ptr
- наиболее часто используемый тип интеллектуального указателя в C ++ 0x. Если у вас достаточно свежий компилятор, он будет в пространстве имен std
. Более старый компилятор может иметь его в пространстве имен tr1
, и это также является частью boost.