new、virtual、override、abstract 等-隐藏与覆盖实际操作

  • new、virtual、override、abstract 等-重载
  • new、virtual、override、abstract 等-隐藏
  • new、virtual、override、abstract 等-覆盖(改写、重写)
  • new、virtual、override、abstract 等-抽象
  • new、virtual、override、abstract 等-隐藏与覆盖实际操作

本文主要用实际讲解下 new、override 的隐藏、覆盖

如果父类有一个方法,派生类也有这个方法,我们讨论以下四种情况:

1、父类方法无修饰符,派生类方法也无修饰符。

2、父类方法无修饰符,派生类方法 new 修饰符。

3、父类方法 virtual 修饰符,派生类方法 new  修饰符。

4、父类方法 virtual 修饰符,派生类方法 override 修饰符。

前三个其实效果都是一样的,是隐藏。不过第一个会有警告,Visual Studio 会提示你是不是搞忘了加 new。

最后一个是覆盖

再看示例,并看看方法嵌套的情况。

上述代码的结果是 12,因为 B 覆盖了,所以调用 B 总是调用派生类的,B 中调用的 A,也是优先在自己的类中找,所以尽管 B 仅仅是隐藏,仍然是在派生类中找。

上述代码的结果是 1b,因为 B 仅仅是隐藏,所以调用的还是 C 中的 B,而 B 调用的 A,由于 A 被覆盖,所以是派生类的 A。

总结一下:

将派生类对象赋给基类时,调用其方法时:

  • 如果方法被隐藏,则调用的是基类的。
  • 如果方法被覆盖,则调用的是派生类的。
  • 如果是间接调用(比如上面的 B 调用 A),则是站在调用者的角度来处理。
  • 如果有多重继承,也是类似的道理,覆盖的方法总是向派生类靠拢,隐藏的方法总是向基类靠拢。

还没完

如果派生类里面要强制访问父类的方法怎么办呢?

使用 base,比如:base.F1();

如果孙子类里面要强制访问爷爷的方法怎么办呢?

除非爸爸没有拦截(不管是 new 还是 override),也就是说除非爸爸没有隐藏、覆盖爷爷的方法,否则孙子没办法直接访问爷爷的方法,base 对应的是爸爸的。

相关阅读

  • 派生类与基类的 static 共享
  • new、virtual、override、abstract 等-重载
  • new、virtual、override、abstract 等-隐藏
  • new、virtual、override、abstract 等-覆盖(改写、重写)
  • new、virtual、override、abstract 等-抽象
  • new、virtual、override、abstract 等-隐藏与覆盖实际操作

你可能感兴趣的