在派生 class 中创建具有相同名称但不同 return 类型的新函数
Creating a new function in a derived class with same name but different return type
//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);
}
在main中会这样调用
Derived2 A;
A.display(std::cout);
Derived2 中的错误是 "return type is not identical to nor covariant with return type "std::ostream &" of overriden virtual function"
据我了解,这是因为函数的签名(在本例中为 return 类型)必须与它被覆盖的函数相匹配,但我认为我的实验室希望我创建一个新函数而不是覆盖它,但具有相同的名称?因为我必须在 Derived2 的 display() 中调用 Derived1 的 display()。有什么想法吗?
哦,是的,我试图用 display() 做的事情被认为是超载,而不是压倒一切,对吗?
你不能这样做,因为 return 类型 不是 协变 !
我认为您错过了 "lab" 的要求。也阅读这些:
- Override a member function with different return type
- C++ virtual function return type
顺便说一句,欢迎来到 Whosebug...确保为您以后的问题构建一个最小示例,以便其他人重现您的问题,帮助他们,帮助您!这是本例中的一个最小示例:
#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
~~~~~~~~~~~~~ ^
//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);
}
在main中会这样调用
Derived2 A;
A.display(std::cout);
Derived2 中的错误是 "return type is not identical to nor covariant with return type "std::ostream &" of overriden virtual function"
据我了解,这是因为函数的签名(在本例中为 return 类型)必须与它被覆盖的函数相匹配,但我认为我的实验室希望我创建一个新函数而不是覆盖它,但具有相同的名称?因为我必须在 Derived2 的 display() 中调用 Derived1 的 display()。有什么想法吗?
哦,是的,我试图用 display() 做的事情被认为是超载,而不是压倒一切,对吗?
你不能这样做,因为 return 类型 不是 协变 !
我认为您错过了 "lab" 的要求。也阅读这些:
- Override a member function with different return type
- C++ virtual function return type
顺便说一句,欢迎来到 Whosebug...确保为您以后的问题构建一个最小示例,以便其他人重现您的问题,帮助他们,帮助您!这是本例中的一个最小示例:
#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
~~~~~~~~~~~~~ ^