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#不允许这样做?允许这种做法是非常合理的,因为它遵循多态的原则.
代码的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,所以这不起作用.