1、严格上说,必须与原来的类型是完全相同的

2、放宽一些,可以返回 原来的返回的类型的 子类的指针或引用。

 

比如

class A{
public:
    virtual int f(){} 
};

class B:public A{
public:
    virtual float f(){}
};

这就会报错,因为你改变了返回类型,无法构成override了。

但是,协变类型也是可以接受的。仅仅是子类的 指针 或 引用。

class A{
public:
        virtual A* get_p()
        {
                return this;
        };
        virtual A& get_r()
        {
                return *this;
        };
        virtual A get_obj()
        {
                cout << "A "<< endl;
        }
};

class B:public A{
public:
        virtual B*get_p()
        {
                return this;
        }
        virtual B& get_r()
        {
                return *this;
        }
/*      //这个是行不通的,最多可以返回父类的子类的引用或指针
        virtual B get_obj()
        {
                return *this;
        }
*/
这个get_obj函数,没有被覆写,所以在子类的虚表中,get_obj依然存放的是A::get_obj()
};

同时需要注意,返回值可以是协变,但是传入的参数不能协变。

posted on 2019-03-26 15:48  newbird2017  阅读(446)  评论(0编辑  收藏  举报