//Base.h
Class Base {
//...
public:
virtual std::ostream& display(std::ostream& os) const =0;
}
//Derived1.h
Class Derived1 : Base {
//...
public:
std::ostream& display(std::ostream&) const;//defined in Derived1.cpp
}
//Derived2.h
Class Derived2 : Derived1{
//...
public:
void display(std::ostream&) const;//error here!!!!!!!!!!!!!!!!!!!!
}
我必须使用void display(std :: ostream&)const;因为它在我实验室的说明书中,无法改变它。 我必须在derived2的显示函数中调用Derived1的显示函数,这很简单,我理解。所以喜欢这个
void Derived2::display(std::ostream& os) const{
Derived1::display(os);
}
它将像这样在
Derived2 A;
A.display(std::cout);
Derived2中的错误是“返回类型与返回类型不同,也不与协调一致”std :: ostream&“覆盖虚函数”
从我读到的内容是因为函数的签名(在这种情况下返回类型)必须与它覆盖的函数匹配,但我认为我的实验室希望我创建一个新函数而不是覆盖它,但是同样的名称?因为我必须从Derived2中的display()中调用Derived1中的display()。有什么想法吗?
哦,是的,我正在尝试使用display()被认为是重载,而不是覆盖权?
答案 0 :(得分:3)
您不能这样做,因为返回类型不协变!
我想你错过了"实验室"要求。阅读这些:
顺便欢迎使用StackOverflow ...确保您将来的问题构建一个最小的示例,让其他人重现您的问题,帮助他们,帮助您!以下是此案例中最小示例的示例:
#include <iostream>
class Base {
public:
virtual std::ostream& display(std::ostream& os) const =0;
};
class Derived1 : Base {
public:
std::ostream& display(std::ostream&) const
{
std::cout << "in Derived1.display" << std::endl;
}
};
class Derived2 : Derived1 {
public:
void display(std::ostream&) const
{
std::cout << "in Derived2.display" << std::endl;
}
};
int main()
{
Derived2 A;
A.display(std::cout);
return 0;
}
会产生此错误:
main.cpp:18:10: error: virtual function 'display' has a different return type
('void') than the function it overrides (which has return type
'std::ostream &' (aka 'basic_ostream<char> &'))
void display(std::ostream&) const
~~~~ ^
main.cpp:10:19: note: overridden virtual function is here
std::ostream& display(std::ostream&) const
~~~~~~~~~~~~~ ^