Under normal circumstances, the return type of a virtual function and it’s override must match. Thus, the following will not work:
classBase
{
public:
virtualint GetValue() { return5; }
};
class Derived: public Base
{
public:
virtual double GetValue() { return6.78; }
};
However, there is one special case in which this is not true. If the return type of a virtual function is a pointer or a reference to a class, override functions can return a pointer or a reference to a derived class.These are called covariant return types. Here is an example:
class Base
{
public:
// This version of GetThis() returns a pointer to a Base class
virtual Base* GetThis() { return this; }
};
class Derived: public Base
{
// Normally override functions have to return objects of the same type as the base function
// However, because Derived is derived from Base, it's okay to return Derived* instead of Base*
virtual Derived* GetThis() { return this; }
};
Note that some older compilers (eg. Visual Studio 6) do not support covariant return types.