我想知道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中具有相同的结果类型。 谢谢你的帮助
答案 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); }
};