2010-10-28 66 views
2

我想知道如果我不把override关键字放在派生类方法m1()的方法之前,那么这之前的默认值是什么,还是会抛出编译时错误?c#覆盖关键字

class A { virtual void m1(){} } 
class B: A { void m1(){} } 
+3

当您编译此代码时,Visual Studio输出了什么? – 2010-10-28 17:57:23

回答

8

首先,你会因为virtual成员不能是私有的,其A.m1是书面得到一个编译时错误。

其次,一旦你解决这个问题,你会得到一个编译时警告,B.m1隐藏继承的成员A.m1

第三,如果你做这样的事情:

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

这将调用A.m1而如果你插入override进入B.m1定义,然后上面会调用B.m1。但是,如果将new插入到B.m1的定义中,那么上述操作仍将调用A.m1,但它将省略编译时警告。

+0

它会隐藏意味着基类方法将不会继承到派生类。如果我使用新的kew,那么获得它将隐藏基类方法。如果是的话,那么使用关键字KEY和不使用关键字KEY的区别是什么KEY – NoviceToDotNet 2010-10-28 17:59:33

+0

“KEY”的意思是'new'吗?不同的是它会摆脱编译时警告。警告在那里告诉你,“嘿,你是否想要重写或隐藏继承的成员?我会假设你想隐藏,但你应该看看这个。” “新”是告诉编译器,“是的,我的意思是隐藏继承的成员。”所以是的,这种行为是一样的,但警告是真正的目的。 C#小心翼翼地阻止你在脚下射击自己。 – jason 2010-10-28 18:01:14

+1

如果你想隐藏它,然后使用“新”来表明你真的想隐藏并且不覆盖它。新做的唯一事情是压制编译器警告。 – CodesInChaos 2010-10-28 18:02:19

1

当你编译它会给你一个警告,说B.m1()隐藏继承成员A.m1()

如果您希望打破继承链或使用覆盖来获得您的虚拟行为,您应该使用new关键字。

2

没有override编译器发出警告,据我记忆。在这种情况下,该方法被视为具有修饰符new