帝江VII 2015-12-24 08:00 采纳率: 100%
浏览 5238
已采纳

大神请指教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条回答 默认 最新

  • 帝江VII 2017-02-08 09:26
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案