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++没有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
的参数,所以这不起作用。