C#中不允许C ++中允许的功能?

时间:2014-04-18 01:16:19

标签: c# c++ inheritance compiler-errors polymorphism

在C ++中,我们可以这样做(伪代码):

class A {
    public:
    virtual void a(A a)=0;
    }

class B : A {
    public:
    virtual void a(B b);
}

但是当我在C#中编写等价物时:

public abstract class A
{
public virtual void a(A a){}
}

public class B : A
{
public override void a(B b){}
}

编译器给出了一个错误,表示B.a没有覆盖A.a.为什么C#不允许这样做?允许这种做法是非常合理的,因为它遵循多态的原则。

1 个答案:

答案 0 :(得分:5)

代码的C ++版本也没有覆盖该方法。但是因为C ++没有override关键字¹,所以你不会得到错误,因为编译器不知道你想要覆盖这个方法。

如果您希望在C#中使用与C ++相同的行为,则可以删除override关键字并将其替换为new

¹它在C ++ 11中有用,但我假设你没有使用它,否则你会遇到错误。

  

允许这种做法是非常合理的,因为它遵循多态的原则。

不,它没有。考虑一下:

A a = new B();
a.a(new A());

如果B.a覆盖A.a,则上述代码会使用参数B.a调用new A()。但B.b采用B类型的参数,因此不起作用。