C# 继承与虚方法

继承与虚方法重写的区别

继承允许子类获取父类的成员(字段、属性、方法等),而虚方法重写(virtualoverride)是继承中的一种多态机制,允许子类重新定义父类中标记为virtual的方法。

  • 继承:子类自动拥有父类的非私有成员,无需重新实现。
  • 虚方法重写 :父类用virtual声明方法,子类用override重写逻辑,运行时根据对象实际类型调用对应方法。

示例代码

csharp 复制代码
using System;

// 父类
public class Animal
{
    // 虚方法
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal makes a sound");
    }
}

// 子类重写虚方法
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks");
    }
}

// 子类不重写虚方法
public class Cat : Animal
{
    // 使用父类的默认实现
}

class Program
{
    static void Main()
    {
        Animal animal = new Animal();
        Animal dog = new Dog();
        Animal cat = new Cat();

        animal.MakeSound(); // 输出: Animal makes a sound
        dog.MakeSound();    // 输出: Dog barks
        cat.MakeSound();    // 输出: Animal makes a sound
    }
}

常见问题与处理方法

问题1:忘记标记virtualoverride

  • 若父类方法未标记virtual,子类无法重写。
  • 若子类用new代替override,会导致隐藏而非重写(编译警告)。

修正方法

csharp 复制代码
public class Bird : Animal
{
    public override void MakeSound() // 正确使用override
    {
        Console.WriteLine("Bird chirps");
    }
}

问题2:误用new关键字导致隐藏

  • new会隐藏父类方法,破坏多态性。

修正方法

csharp 复制代码
public class Fish : Animal
{
    public new void MakeSound() // 不推荐,仅用于特殊场景
    {
        Console.WriteLine("Fish bubbles");
    }
}

问题3:基类调用被重写方法

  • 子类可通过base调用父类实现。

示例

csharp 复制代码
public class Lion : Animal
{
    public override void MakeSound()
    {
        base.MakeSound(); // 调用父类方法
        Console.WriteLine("Lion roars");
    }
}

关键总结

  • 多态需通过virtualoverride配合实现。
  • 避免滥用new,优先使用重写。
  • 使用base可保留父类逻辑扩展功能。
相关推荐
微学AI4 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡5 小时前
算法日记 - Day3
java·开发语言·算法
凯丨5 小时前
AI 蠕虫来了:恶意文档如何通过 Copilot for Word 自我传播?
人工智能·c#·copilot
韭菜炒鸡肝天5 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
Aaron - Wistron6 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
笨鸟先飞,勤能补拙6 小时前
AI 赋能网络安全领域深度剖析
网络·人工智能·windows·安全·web安全·网络安全·github
Dxy12393102167 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
我上去就是一套QWER然后等待复活7 小时前
Windows 清理 CC Switch 并恢复官方 Codex CLI 登录流程(完整记录)
windows
0566468 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄8 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#