我可以通过使用不同的返回值来重载或覆盖方法吗?在这种情况下是虚拟的事情吗?
例如:
class A{
virtual int Foo(); // is this scenario possible with/without the keyword virtual
}
class B : public A {
virtual double Foo();
}
A* Base = new B();
int i = Base->Foo(); // will this just convert double to int ?
关于重载:
class A{
virtual int Foo();
virtual float Foo(); // is this possible ?
int Goo();
float Goo(); // or maybe this ?
}
Class B{
double Foo();
}
感谢
答案 0 :(得分:8)
函数的返回类型不是其签名的一部分,因此不能重载。
答案 1 :(得分:4)
返回值不是函数签名的一部分,编译器现在将如何选择哪个版本?
如果您在第一个示例中从virtual
移除了Foo
,那么它将有效并致电Base::Foo
。
答案 2 :(得分:4)
不,你做不到。
在overriden方法中可以做的是返回一个指针/引用,该类型是父方法返回的类型的后代。
示例:
struct VA {}
struct VB : struct VA {}
class A
{
public:
virtual VA * get();
}
class B
{
public:
virtual VB * get();
}
答案 3 :(得分:1)
只能改变返回值才能进行重载。
考虑一下:
Base->Foo();
调用没有任何返回值赋值然后编译器无法推断出要调用的方法。
virtual
关键字用于创建VTable
,从而证明了动态多态性。它对重载方法没有影响。
答案 4 :(得分:1)
返回值不是签名的一部分,不幸的是,所以没有。
答案 5 :(得分:1)
不,你可以做一些类似的事情,例如将返回值模板化(可能带有特化)并在调用例如
时指定模板类型template<T>
T Foo()
{
return 0;
}
template<>
double Foo<double>()
{
return 3.14;
}
int i = Foo<int>(); // 0
double d = Foo<double>(); //3.14
答案 6 :(得分:1)
就重写而言,它与类层次结构有关,并且可以实现运行时多态性。
class Abstract
{
public :
virtual Abstract* Clone() const = 0;
};
class Concrete1 : public Abstract
{
public :
Concrete1* Clone() const { return new Concrete1(*this); }
};
class Concrete2 : public Abstract
{
public :
Concrete2* Clone() const { return new Concrete2(*this); }
};
根据C ++标准,无法跨范围进行重载。
答案 7 :(得分:1)
如果你使用VC ++,你会得到一个“重载方法只有不同的返回类型”错误类型。这是因为方法/函数签名不包含返回类型。我猜这是因为如果没有将返回值分配给任何东西,它可能导致歧义。例如
int iMyvar = object.method(); //显然应该返回什么类型
对比: -
的object.method(); //如果返回类型是签名的一部分,编译器会调用哪个重载? Ambiguos。