本文内容均为本人平时遇到的一些无法从翻译中看出原因的错误。学海无涯,难免有所疏漏,如有错误欢迎各位在评论区指正。
(1) error: invalid covariant return type for(非法的协变返回类型)
c++允许在派生类中定义和基类同名的函数,比如BrassPlus类由Brass类派生而来,则可定义以下两个同名函数
virtual returntype Brass::ViewAcct(parameter list){
//...
}
virtual returntype BrassPlus::ViewAcct(parameter list){
//...
}
在不涉及继承和派生的概念时,可以设计同名不同参数的函数实现重载
功能,例如设计三个打印函数分别打印整型、浮点型或者字符型,此时会根据给定的参数选择正确的函数执行,这个过程由编译器完成,叫做静态联编
。
void print(int i){
cout<<"整型"<<i<<endl;
}
void print(float i){
cout<<"浮点型"<<i<<endl;
}
void print(char i){
cout<<"字符型"<<i<<endl;
}
而在继承关系中,实现在派生类和基类之间重载的同名函数的重载,这涉及虚函数概念:会在运行过程中根据指针或者引用所指具体对象的具体类型选择正确的虚函数进行执行,这被称为动态联编
。
比如想实现以下
Brass *p1,*p2;
Brass b1(构造函数的参数);
BrassPlus b2(构造函数的参数);
p1=&b1;
p2=&b2;
p1->ViewAcct(parameter list);//自动调用Brass::ViewAcct()
p2->ViewAcct(parameter list);//自动调用BrassPlus::ViewAcct()
就必须满足以下两点
1. 参数必须完全一致,否则将会隐藏同名的基类方法,试图调用此基类方法的行为是非法的。
2. 其次返回类型也要完全一致,但只有一种情况例外——如果返回类型是基类引用或指针,则可以修改为指向派生类的引用或指针。这种特性被称为返回类型协变
。
所谓“非法的协变返回类型”就是指没有按照协变规则正确的设计函数的返回类型,应当检查需要重载的函数返回类型是否为正确的引用或者指针。