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
相关产品推荐
相关产品推荐

