在派生 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" 的要求。也阅读这些:

  1. Override a member function with different return type
  2. 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
    ~~~~~~~~~~~~~ ^