C# 继承与虚方法

继承与虚方法重写的区别

继承允许子类获取父类的成员(字段、属性、方法等),而虚方法重写(virtual和override)是继承中的一种多态机制,允许子类重新定义父类中标记为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:忘记标记virtual或override

  • 若父类方法未标记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");
    }
}

关键总结

  • 多态需通过virtual和override配合实现。
  • 避免滥用new,优先使用重写。
  • 使用base可保留父类逻辑扩展功能。
相关推荐
小王C语言7 分钟前
Qt常用控件:按钮类控件,普通按键、单选、复选
开发语言·qt
街头便衣9 分钟前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
老王IT16 分钟前
PHP语言基础语法介绍
开发语言·php
2501_944521599 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
行思理9 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
wangchunyu11410 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
程序 代码狂人11 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
meiying883813 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
LannyChung13 小时前
PowerShell 下 git log 中文乱码的完整排查与解决
windows·git