You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#继承:override与virtual疑问——如何在基类A中调用派生类B的Callee方法?

在C#中实现基类Caller调用派生类Callee的方法

嘿,作为刚接触virtual和override的初学者,这个场景刚好能帮你理解C#的多态特性,我给你拆解清楚怎么实现:

核心思路

要让基类A的Caller方法调用派生类B的Callee,关键是把基类的Callee声明为虚方法(virtual),然后在派生类中用override重写这个方法。这样当通过基类引用调用Callee时,会自动触发派生类的重写版本,这就是多态的核心作用。

完整代码示例

// 基类A
public class A
{
    // 将Callee标记为virtual,允许派生类重写
    public virtual void Callee()
    {
        Console.WriteLine("这是基类A的Callee方法");
    }

    public void Caller()
    {
        // 这里调用的Callee会根据实际实例类型动态决定
        Callee();
    }
}

// 派生类B,继承自A
public class B : A
{
    // 用override重写基类的virtual方法
    public override void Callee()
    {
        Console.WriteLine("这是派生类B的Callee方法");
    }
}

// 测试代码
class Program
{
    static void Main(string[] args)
    {
        // 即使声明为基类A的类型,指向的是B的实例
        A instance = new B();
        // 调用Caller,最终会执行B的Callee
        instance.Caller();
    }
}

运行结果

运行上面的代码,控制台会输出:

这是派生类B的Callee方法

关键注意点

  • 如果你在派生类B中用new关键字而不是override(比如public new void Callee()),那基类A的Caller会调用自己的Callee,而不是B的版本——因为new是隐藏基类方法,不是重写,不会触发多态。
  • 只有当方法被标记为virtual(或者abstract、override)时,才能在派生类中用override重写,实现动态绑定。

内容的提问来源于stack exchange,提问作者Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:23:52