结果类型和c ++中的重新定义

时间:2013-12-21 20:27:21

标签: java c++

我想知道c ++如何接受改变结果类型的重新定义方法? 这在java中是不可接受的,我想了解机制,这里是一个代码示例,它完全没有意义,但它只是一个简单的例子:

#ifndef __revision__Ex1b__
#define __revision__Ex1b__

#include <iostream>

class Ex1b {
public:
Ex1b f() {
    return *(new Ex1b()) ;
}

};

#endif /* defined(__revision__Ex1b__) */

#ifndef __revision__Ex1b2__
#define __revision__Ex1b2__

#include <iostream>
#include "Ex1b.h"

class Ex1b2 : public Ex1b  {

public:
std::string f() { std::string ch = "dhfkjn" ;
    return ch ;
}
};

#endif /* defined(__revision__Ex1b2__) */
在Java中

这是不可接受的,方法f必须在Ex1b和Ex1b2中具有相同的结果类型。 谢谢你的帮助

3 个答案:

答案 0 :(得分:4)

在C ++中,这不是覆盖函数(就像在Java中一样),而是隐藏基本成员函数。 It's document here以及网络上的其他位置。为了在C ++中覆盖一个函数,你需要使它成为虚拟(如果你重写它,你会得到一个像在Java中一样的错误,但是你不是在这里压倒它。)

Ex1b2现在有两个不同的方法,每个方法都名为f()。要调用基类的版本,您可以调用Ex1b::f()

答案 1 :(得分:2)

在C ++中,该方法未在子类中重新定义,而是隐藏超类中的方法。一个不是对另一个的重新定义,所以它们并不是不相容的。这是因为你没有将超类中的函数f()声明为 virtual

在Java中,默认情况下方法是虚拟的,因此您会看到错误。另一方面,如果您将超类中的方法声明为“final”(使其成为非虚拟),那么您将获得不同的错误,因为您无法覆盖最终方法。

答案 2 :(得分:0)

除了其他人给出的响应之外,值得指出的是,当覆盖virtual函数时,返回类型甚至可以改变,尽管只在一些约束内。在C ++指针和引用中,返回类型可以是协变。这是派生类可以返回指向另一个派生类型的指针或引用。例如:

struct B {
    virtual B* clone() const { return new B (*this);
};
struct D: B {
    D* clone() const override { return new D(*this); }
};