qq_31175231
帝江VII
采纳率100%
2015-12-24 08:00

大神请指教c++错误:返回类型与重写虚拟函数的返回类型既不相同也不协变

已采纳

#include
using namespace std;

class base1{
public:
virtual void display() const;

};

void base1::display() const{
cout<<"base1::display()"<<endl;
}

class base2:public base1{
public:
void display() const;
};

void base2::display() const{
cout<<"base2::dispaly()"<<endl;
}

class driver:public base2{
public:
int display() const; //这边为什么会报错?
};

int driver::display() const{
cout<<"driver::display()"<<endl;
return 0;
}

void fun(base1* ptr){
ptr->display();
}

int main(){
base1 base1;
base2 base2;
driver driver;
fun(&base1);
fun(&base2);
fun(&driver);
return 0;
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • qq_31175231 帝江VII 4年前

    函数名一样,形参一样,所以在派生类中,尽管没有加virtual,它还是虚函数.
    根据规则,一般来说,子类对父类某一函数进行重写,必须具备相同的返回值类型。这一规则对协变返回类型却有所放松,也即,子类对父类的某一函数进行重写时,子类函数的返回值类型可以父类函数返回值类型的子类的指针或者引用类型,语义上要求子类与父类能够构成一种is-a关系。

    点赞 评论 复制链接分享
  • YXTS122 YXTS122 6年前

    我找时间上机看看你这段代码,现在在外面不档便。。

    点赞 3 评论 复制链接分享
  • wenpinglaoyao 纹枰老妖 6年前

    最后那个覆盖两种类型不一样,一个void,一个int

    点赞 1 评论 复制链接分享
  • qq_31175231 帝江VII 6年前

    为什么覆盖类型要一样?是什么语法?新手不太懂、、请详细指教@纹枰老妖

    点赞 评论 复制链接分享

相关推荐