c# - 在 C++ 中允许的函数在 C# 中不允许?

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

最佳答案

代码的 C++ 版本也不会覆盖该方法。但是因为 C++ 没有 override 关键字¹,所以您不会收到错误,因为编译器不知道您打算覆盖该方法。

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

¹ 它在 C++11 中确实如此,但我假设您没有使用它,否则您会得到一个错误。

It is very resonable to allow this practise because it obeys the principles of polymorphism.

不,它没有。考虑一下:

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

如果 B.a 覆盖了 A.a,上面的代码将调用 B.a 并带有参数 new A()。但是 B.b 需要一个类型为 B 的参数,所以这是行不通的。

关于c# - 在 C++ 中允许的函数在 C# 中不允许?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23145964/

相关文章:

c++ - fopen() 在内部更改我的文件名?

c++ - 为什么创建大于内存的一维数组失败,但创建大于内存的二维数组没有问题?

c# - 内部抽象类 : how to hide usage outside assembly?

python - 设计异常继承的标准方法是什么?

c# - 用户代码是否重新抛出 OperationCanceledException,从其自己的 try-catch 中捕获

c++ - 如何将 MATLAB 图像处理库内置函数转换为 matlab coder 代码生成不支持的 c++?

C#:反转句子中的单词

inheritance - JPA 多重鉴别器值

c# - 使用泛型返回各种类型的List

c# - Newtonsoft.Json DeserializeObject 为 guid 00000000-0000-0000-0000-000000000000 传递 null