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);
}
我可以这样做吗?如果这是正确的语法?
答案 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];
显然,当a
是B
类型的对象时,最后一行是没有意义的。在这种情况下,您尝试为角色分配Sequence
。同样,如果Sequence c = (*a)[0];
是a
类型的对象,则A
没有意义。
答案 2 :(得分:1)
正确的解决方案是使A
成为类C
和D
的成员而不是基类。由于C
和D
需要公共方法的不同签名,因此在每个上下文中它们显然都不等同于A
,因此尝试在此使用继承实际上没有任何意义。< / p>
答案 3 :(得分:0)
好的,查看关于序列(A
),GeneSequence(B
)和GenomeSequence(C
)的最新评论
您希望操作员有时返回char
,有时会返回Sequence
然后,正如您所看到的,超类A
将&operator []
的类型声明为char
是不正确的。
它应该使用模板作为类型参数来指定它是char
s还是Sequence
s的集合,对吗?