我可以覆盖运算符的重载并返回不同的类型吗?

时间:2010-10-16 01:01:18

标签: c++ operator-overloading polymorphism covariance virtual-functions

class A{
  public: 
    virtual char &operator[](int);
  protected:
    ..
};
class B:A{
  public:
    A* &operator[](int);
  protected:
}

当我重载运算符的重载时,是否可以更改返回类型?

谢谢!

//修改 好的,现在我们已经确定这不会起作用,我该如何构建一个工作?

假设我有A,B,C和D类。

class A{
  public: 
  private:
    char &operator[](int);
  protected:
    ..
};
class B:A{
  public: 
    virtual char &operator[](int);
};
class C: A{
  public:
  private:
    A::&operator[](int);
}
class D: A{
  public:
  private:
     A::&operator[](int);
}

我可以这样做吗?如果这是正确的语法?

4 个答案:

答案 0 :(得分:4)

不喜欢这样,不。

覆盖的返回类型必须是

  • 与被覆盖的虚拟函数的返回类型相同的类型,或
  • 被覆盖的虚函数的返回类型的派生类(这称为“协变返回类型”)。

因此,如果虚拟A::operator[]返回了A*,则B::operator[]覆盖可能会返回B*

答案 1 :(得分:3)

多态函数不能在不同的类中返回不同类型的原因并不是因为C ++委员会的某个人认为它是“禁忌”,而是因为任何使用该函数的返回值的代码都无法编译。

通过创建继承层次结构,您可以通过基指针或引用访问派生对象:

class A
{
public:
    virtual char operator[](int);
};
class B : public A
{
public:
    virtual char operator[](int);
};

A *a;

std::cout << "Do you want to make an A or a B?";

char type;
std::cin >> type;

if (type == 'A')
    a = new A();
else
    a = new B();

char c = (*a)[0];

请注意,在最后一行,编译器将不知道对象a指向的是哪种类型,因为这是在运行时确定的。这很好,因为无论对象a指向什么类型的对象,operator[]仍然会返回一个字符。但是如果允许该运算符在类B中返回不同类型呢?

class Sequence
{
    ...
};

class A
{
public:
    virtual char operator[](int);
};
class B : public A
{
public:
    virtual Sequence operator[](int);
};

A *a = new B();
char c = (*a)[0];

显然,当aB类型的对象时,最后一行是没有意义的。在这种情况下,您尝试为角色分配Sequence。同样,如果Sequence c = (*a)[0];a类型的对象,则A没有意义。

答案 2 :(得分:1)

正确的解决方案是使A成为类CD的成员而不是基类。由于CD需要公共方法的不同签名,因此在每个上下文中它们显然都不等同于A,因此尝试在此使用继承实际上没有任何意义。< / p>

答案 3 :(得分:0)

好的,查看关于序列(A),GeneSequence(B)和GenomeSequence(C)的最新评论

您希望操作员有时返回char,有时会返回Sequence

然后,正如您所看到的,超类A&operator []的类型声明为char是不正确的。

它应该使用模板作为类型参数来指定它是char s还是Sequence s的集合,对吗?