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()
};
同时需要注意,返回值可以是协变,但是传入的参数不能协变。