Why do you expect that to work? You can't treat a Base
object as if it were a Child
object, because the Child
class might have all sorts of additional data that Base
does not.
In order to get the effect you're looking for, there are two ways to do it:
The first way, and probably the best idea, is to move the logic from createBase
into the Base
constructor. The Base
constructor will run whether you're creating a Base
or something derived from it. It looks like you're trying to do the work of initializing the base object, and that's exactly what constructors are for!
If for some reason this will not work in your case, the other option is to create a protected initialize
method in Base
which accepts a Base*
and does all the work that you are currently doing in createBase
, e.g.
class Base
{
public:
static Base* createBase()
{
Base* b = new Base();
initialize(b);
return b;
}
protected:
static void initialize(Base* b)
{
... //does a lot of weird things
}
}
class Child : public Base
{
public:
static Child* createChild()
{
Child *c = new Child();
initialize(c):
return c;
}
}
Note that this works since, while you can't treat a Base*
as if it were a Child*
, you can go the other way and treat a Child*
as if it were a Base*
, because the Child
class is guaranteed to have at least everything that the Base
class does, due to the nature of inheritance.
Edit: I saw you post in a comment to another answer that you cannot modify the definition of Base
. In that case, you are completely out of luck and you will have to accept the need to copy-and-paste, given the restrictions in play. You are not going to be able to call createBase
and get back a pointer to an object of any type other than Base
if you cannot modify its code.