Welcome to the wonderful world of subtle differences between Java and C++. If you come from a Java background, a value of type IA
is of type IA
or any subclass thereof. But in C++, a value of type IA
is a concrete instance of IA
, nothing more and nothing less. And your IA
is abstract, hence there are no concrete instances, so as written, your IB::bar
is unsatisfiable. There's no well-defined function that can ever have that type.
Instead, when you want to do Java-style inheritance-based polymorphism (which is often not the answer in C++, but we'll assume it's the right tool for the job for the moment), you need a layer of indirection. That can be a raw pointer (IA*
), a reference (IA&
), or a smart pointer (unique_ptr<IA>
).
By convention, we return a smart pointer if the data is intended to be owned by the caller (i.e. the caller is responsible for freeing it when done), a reference if it's owned by someone else, and a raw pointer if we want our fellow programmers to suffer. I'll assume you intend that the caller own the IA
value, so we'll use a smart pointer.
Your interfaces can be written
#include <memory>
class IA {
virtual void foo() = 0;
};
class IB {
virtual std::unique_ptr<IA> bar() = 0;
};
And we can concretely implement them as follows
class A : public IA {
virtual void foo() {}
};
class B : public IB {
virtual std::unique_ptr<IA> bar() {
return std::make_unique<A>();
}
};