Because how would the code that's using the return value cope with all sorts of unrelated types coming back? e.g.:
class A
{
public:
virtual float func();
};
class B: public A
{
public:
virtual char *func();
};
A *p = (some_condition) ? new A() : new B();
p->func(); // Oh no! What is the type?