方法覆盖和重载

时间:2009-12-18 11:12:42

标签: c++ polymorphism overloading override

我可以通过使用不同的返回值来重载或覆盖方法吗?在这种情况下是虚拟的事情吗?

例如:

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();
}

感谢

8 个答案:

答案 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。