在具有相同名称但返回类型不同的派生类中创建新函数

时间:2016-09-03 19:14:36

标签: c++ function oop inheritance pure-virtual

//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()被认为是重载,而不是覆盖权?

1 个答案:

答案 0 :(得分:3)

您不能这样做,因为返回类型协变

我想你错过了"实验室"要求。阅读这些:

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