关于virtual和override的在类继承中的调用关系

定义四个类,A,B,C,D。继承关系D→C→B→A。假设ABCD里有相同名相同参数的方法。

分四种情况(不考虑派生类用基类实例化的情况,因为这种情况不常见。比如 派生类 p=new 基类(),这个不讨论)

1)A里的是抽象方法,其他三个是重写的

结论是,调用的方法和实例化时使用的类名相关,用哪个类名实例化就调用哪个类里的方法。比如 B b=new D();则调用D里的方法。这种情况就是看new 哪个;

2)AB是virtual,CD是override,则A类型的对象不论实例化为哪种类型,都掉用自己的,比如 A a=new B();调用A的,new C();还是调用A的,new D();一样调用A的。BCD遵循 1)。

3)AC 里的是virtual,BD的是override。则B调用自己的方法。A的情况是,A a=new A();调用A的,A a=new B/C/D(); 调用父类的。C遵循 1)。

4)ABC的是virtual,D是override。则A、B调用自己的方法。B遵循1)。

5)AD是virtual,BC是override。A a=new D();,则a调用C的。即,在多层类里,继承里的从直接派生的类开始的连续的最远(包含在new的类及其以上的类(此处指DBC))是override的方法(此处是C的)。换句话说就是调用多层继承里的从直接派生的类开始的(包含在new的类及其以上的类(此处指DBC))连续的是override的方法的(此处是BC)离new 类名最近的类(类C)里方法

我的结论是,如果一个类 M,它有virtual方法 Fun,如果它的派生类(直接派生的,比如B→A)也有Fun,切派生类的Fun是oerride,则 M的Fun会根据实例化时new的类型判断使用那个Fun。如果M下面有多层(不是多重,C#不允许多重继承类)继承类,且有Fun,则调用时,如果M是用new M()实例化,就调用M的Fun。否则如果直接派生的子类也是virtual,则只调用自己的Fun。否则参照5)。多层继承上的其他类也是这么讨论。谢谢阅读。请提出意见

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值