【问题标题】:Different return value of an overridden class [duplicate]覆盖类的不同返回值[重复]
【发布时间】:2012-04-08 11:16:39
【问题描述】:

可能重复:
c++ virtual function return type

我有一个简单但令人困惑的问题。覆盖方法的返回值类型与基类中定义的抽象方法不同是否合法?我这样做了,编译器没有抱怨……有人可以解释一下吗?

class MyBaseClass
{
    int value;

public:
    virtual int getValue() = 0;
};

class MyClass : public MyBaseClass
{
    double value;

public:
    virtual double getValue(); // here!!! return is double, not int
};

double MyClass::getValue()
{
   return this->value;
}

编译器完全接受了类似的东西(MSVC und MinGW)...谁能解释一下这在多大程度上是合法的?

【问题讨论】:

  • 如果你的子类使用双精度,为什么你的基类有 int 值?
  • GCC 4.6.1 抱怨:错误:为“virtual double MyClass::getValue()”指定的返回类型冲突
  • 实际上在我的程序中它不是 int 和 double。它是 double 和 MathVector,有 3 个分量。基类生成标量信号,派生类生成3D信号。

标签: c++ class inheritance polymorphism overriding


【解决方案1】:

返回类型允许不同,但仅限于限制性的方式,并且您的代码是非法的。允许覆盖的返回类型不同的唯一方法是,如果基的返回类型是指针或引用,则它可以是协变的。换句话说:如果基类返回一个指针或对基类的引用,则允许覆盖分别返回基类派生类的指针或引用。

【讨论】:

  • 你如何解释我的代码可以编译?方法更纯粹!如果它没有被覆盖并定义为一个新方法,那么编译器必须抱怨没有使用纯方法!!!我真的很困惑!
  • 您发布的代码无法编译
  • 在我的代码中,我有 double(在基类中)和 MathVector(在派生类中,3 是 3 维),以及 MathVector 的构造函数接受 double 作为参数。难道是程序自动进行隐式转换使其工作?
  • 如果您的编译器接受您发布的代码,则它不符合 C++ 标准。覆盖函数的返回类型必须匹配或协变(如果基返回 int,则不能。有关正确的错误消息,请参阅 this example。
【解决方案2】:

你在压倒一切吗?看起来你只写了一个方法,没有别的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多