【问题标题】:C++ Overriding function with different return type than in base class [duplicate]C ++覆盖函数具有与基类不同的返回类型[重复]
【发布时间】:2012-11-07 08:06:57
【问题描述】:

可能重复:
it is possible to change return type when override a virtual function in C++?

我收到错误:

error: conflicting return type specified for âvirtual bool D::Show()
7: error: overriding âvirtual void A::Show()"

当我编译我的代码时。代码是:

class A
{
       public:  
       virtual void Show()
       {
        std::cout<<"\n Class A Show\n";
       }
};

class B :  public A
{
    public:
    void Show(int i)
    {
            std::cout<<"\n Class B Show\n";
    }
};

class C
{
    public:
    virtual bool Show()=0;
};

class D :public C, public B
{
    public:
        bool Show(){
            std::cout<<"\n child Show\n";
            return true;}
};

int main()
{
    D d;
    d.Show();
    return 0;
}

我想使用 C 类的 Show() 函数。我的错误在哪里?

【问题讨论】:

标签: c++ inheritance overriding


【解决方案1】:

您的编译器在抱怨,因为这两个函数的返回类型不同:其中一个返回void,另一个返回bool。您的两个函数应该具有相同的返回类型

你应该有

class A {
   public:  
   virtual bool Show() {
      std::cout<<"\n Class A Show\n";
      return true; // You then ignore this return value
   }
};

class B :  public A {
   public:
   bool Show(int i) {
      std::cout<<"\n Class B Show\n";
      return true; // You then ignore this return value
   }
};

如果您无法更改类AB,您可以更改类CD 以使用void Show() 方法而不是bool Show() 方法。

如果你不能做这些事情,你可以使用composition over inheritance:在你的D函数中拥有一个B类型的成员,而不是从它继承:

class D : public C {
public:
    bool Show() {
        std::cout<<"\n child Show\n";
        return true;
    }
    void ShowB() {
        b.Show();
    }

private:
    B b;
};

【讨论】:

  • 不,我不能改变函数的返回类型......我已经使用了这个代码,我想在我的子类中使用 C 类的显示函数..
  • 您可以尝试组合:在您的D 函数中添加B 类型的成员,而不是从B 继承
  • 嗯,这就是我的想法..任何方式都非常感谢您的快速帮助..:)
【解决方案2】:

您需要添加一个中间人。 比如:

class C1 : public C{
public:
    virtual bool show(){ /* magic goes here */ }
};

class D: public C1, public B{
....

要调用 Show,您需要以下内容: static_cast&lt;C&amp;&gt;(c).Show();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多