gl5_progのメモ

自分のためのメモとかまとめとか

C++でオーバーライド時に戻り値の違いは許されるのかどうか。あるいは共変の戻り値について。

C++は共変の戻り値である場合、戻り値が違っていてもオーバーライドが許されるらしい。 共変の戻り値とは、オーバーライド時に基底クラスで置き換えができる戻り値のことらしい。 ちなみにC#は、この共変の戻り値でもオーバーライドは許されてないらしい。

参考リンク

コード例

http://ideone.com/BiGPTT

#include <stdio.h>

class BaseA
{};
class DerivedA : public BaseA
{};
class Foo
{};
class Bar
{};

class BaseB
{
    virtual BaseA* ReturnCovariantType( void ){ return 0; }
    virtual Foo*   ReturnDifferentType( void ){ return 0; }
};
class DerivedB : public BaseB
{
    virtual DerivedA* ReturnCovariantType( void ){ return 0; }
    /* prog.cpp:20:20: error: invalid covariant return type for âvirtual Bar* DerivedB::ReturnDifferentType()â
   virtual Bar*      ReturnDifferentType( void ){ return 0; }
   */
};

int main( void )
{
    DerivedB b;
    return 0;
}