C++中允许的函数在C#中是不允许的

本文关键字:不允许 函数 C++ | 更新日期: 2023-09-27 17:58:47

在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#不允许这样做?允许这种做法是非常合理的,因为它遵循多态性的原则。

C++中允许的函数在C#中是不允许的

C++版本的代码也不会覆盖该方法。但是,由于C++没有override关键字cco,因此不会出现错误,因为编译器不知道您打算重写该方法。

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

在C++11中确实如此,但我假设你没有使用它,否则你会出错。

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

不,不是。考虑一下:

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

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