仮想関数のオーバーライドにおいて、返り値の型

オーバーライドされる関数の返り値が、あるクラスのポインタ、もしくは参照であるとき、オーバーライドする関数の返り値の型は、派生クラスのポインタ、もしくは派生クラスの参照でもOKです。
つまり、以下のようなことができるということです。

struct RetBase{
	RetBase(){}
	virtual ~RetBase(){}
};

struct RetDerived : public RetBase{
	RetDerived(){}
	virtual ~RetDerived(){}
};

struct Base{
	Base(){}
	virtual ~Base(){}
	virtual RetBase* hoge(){};
	virtual RetBase& piyo(){};
};

struct Derived : public Base{
	Derived(){}
	virtual ~Derived(){}
	virtual RetDerived* hoge(){};
	virtual RetDerived& piyo(){};
};