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

Bli*_*lip 0 c# c++ polymorphism inheritance compiler-errors

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

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

class B : A {
    public:
    virtual void a(B b);
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class B : A
{
public override void a(B b){}
}
Run Code Online (Sandbox Code Playgroud)

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

sep*_*p2k 5

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

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

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

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

不,它没有.考虑一下:

A a = new B();
a.a(new A());
Run Code Online (Sandbox Code Playgroud)

如果B.a覆盖A.a,上面的代码将B.a使用参数调用new A().但是B.b接受类型的参数B,所以这不起作用.