C# 继承(Inheritance)详解

继承(Inheritance)是 C# 面向对象编程(OOP)的核心特性之一,它允许一个类获得另一个类的成员(字段、属性、方法等),从而实现代码复用,并建立类之间的层次关系。

简单理解:

子类(派生类)继承父类(基类)的特征,并可以扩展或修改这些特征。

例如:

  • 动物 → 狗
  • 交通工具 → 汽车
  • 员工 → 程序员

这些关系都符合:

狗是一种动物

汽车是一种交通工具

程序员是一种员工

在 C# 中通常称为 is-a 关系


1. 基本语法

C# 使用冒号 : 表示继承。

语法:

cs 复制代码
class 子类 : 父类
{

}

例如:

cs 复制代码
// 父类
class Animal
{
    public string Name;

    public void Eat()
    {
        Console.WriteLine("动物吃东西");
    }
}


// 子类继承 Animal
class Dog : Animal
{

}

使用:

复制代码
Dog dog = new Dog();

dog.Name = "旺财";

dog.Eat();

输出:

复制代码
动物吃东西

虽然 Dog 没有定义 Eat() 方法,但是继承了 Animal 的方法。


2. 继承获得什么?

子类可以继承父类:

成员 是否继承
public 字段
public 属性
public 方法
protected 成员
private 成员
构造函数
析构函数

例如:

cs 复制代码
class Person
{
    public string Name;

    protected int Age;

    private string Password;

    public void Speak()
    {
        Console.WriteLine("说话");
    }
}


class Student : Person
{

}

Student:

可以访问:

cs 复制代码
Name;
Age;
Speak();

不能访问:

复制代码
Password;

3. 父类和子类关系

例如:

cs 复制代码
class Animal
{
    public void Eat()
    {
        Console.WriteLine("吃东西");
    }
}


class Cat : Animal
{
    public void CatchMouse()
    {
        Console.WriteLine("抓老鼠");
    }
}

调用:

cs 复制代码
Cat cat = new Cat();

cat.Eat();
cat.CatchMouse();

输出:

复制代码
吃东西
抓老鼠

结构:

复制代码
Animal
  |
  |
 Cat

Cat 拥有:

复制代码
Eat()
CatchMouse()

4. 子类扩展父类功能

继承最大的作用:

在已有功能基础上增加新功能。

例如:

cs 复制代码
class Employee
{
    public string Name;

    public void Work()
    {
        Console.WriteLine("工作");
    }
}


class Programmer : Employee
{
    public void WriteCode()
    {
        Console.WriteLine("写代码");
    }
}

使用:

cs 复制代码
Programmer p = new Programmer();

p.Name = "张三";

p.Work();

p.WriteCode();

输出:

复制代码
工作
写代码

5. 方法重写(override)

继承后,有时候子类需要改变父类的方法行为。

这叫:

方法重写(Override)

父类:

cs 复制代码
class Animal
{
    public virtual void Sound()
    {
        Console.WriteLine("动物叫");
    }
}

注意:

virtual

表示:

这个方法允许子类修改。

子类:

cs 复制代码
class Dog : Animal
{
    public override void Sound()
    {
        Console.WriteLine("汪汪叫");
    }
}

调用:

cs 复制代码
Animal a = new Dog();

a.Sound();

输出:

复制代码
汪汪叫

6. virtual 和 override

继承中常见组合:

父类

复制代码
public virtual 方法()

允许修改。

子类

复制代码
public override 方法()

重新实现。

例如:

cs 复制代码
class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("画图形");
    }
}


class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("画圆");
    }
}

7. base 关键字

base 表示:

调用父类成员

例如:

cs 复制代码
class Animal
{
    public void Eat()
    {
        Console.WriteLine("吃东西");
    }
}


class Dog : Animal
{
    public void Eat()
    {
        base.Eat();

        Console.WriteLine("狗吃骨头");
    }
}

调用:

cs 复制代码
Dog d = new Dog();

d.Eat();

输出:

复制代码
吃东西
狗吃骨头

8. 调用父类构造函数

子类对象创建时:

一定会先调用父类构造函数。

例如:

cs 复制代码
class Person
{
    public Person()
    {
        Console.WriteLine("Person构造");
    }
}


class Student : Person
{
    public Student()
    {
        Console.WriteLine("Student构造");
    }
}

执行:

复制代码
Student s = new Student();

输出:

复制代码
Person构造
Student构造

顺序:

复制代码
父类构造
    ↓
子类构造

9. 使用 base 调父类构造

父类:

cs 复制代码
class Person
{
    public Person(string name)
    {
        Console.WriteLine(name);
    }
}

子类:

cs 复制代码
class Student : Person
{
    public Student()
        : base("学生")
    {

    }
}

执行:

复制代码
Student s = new Student();

输出:

复制代码
学生

10. C# 不支持多继承

C#:

❌ 不允许:

cs 复制代码
class Dog : Animal, Pet
{

}

一个类只能继承一个父类。

但是支持多个接口:

cs 复制代码
class Dog : Animal, IRunnable, IFlyable
{

}

结构:

cs 复制代码
        Animal
           |
          Dog
        /     \
 IRunnable   IFlyable

11. sealed 禁止继承

如果不希望别人继承你的类:

使用:

复制代码
sealed

例如:

cs 复制代码
sealed class MathHelper
{

}

下面会报错:

cs 复制代码
class MyMath : MathHelper
{

}

错误:

复制代码
无法从密封类型继承

12. 抽象类继承

抽象类:

不能直接创建对象。

例如:

cs 复制代码
abstract class Animal
{
    public abstract void Sound();
}

子类必须实现:

cs 复制代码
class Dog : Animal
{
    public override void Sound()
    {
        Console.WriteLine("汪汪");
    }
}

使用:

复制代码
Animal a = new Dog();

a.Sound();

13. 继承与多态

继承是多态的基础。

例如:

cs 复制代码
class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("动物声音");
    }
}


class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("汪汪");
    }
}


class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("喵喵");
    }
}

统一调用:

cs 复制代码
Animal[] animals =
{
    new Dog(),
    new Cat()
};


foreach(Animal a in animals)
{
    a.Speak();
}

输出:

复制代码
汪汪
喵喵

这就是:

父类引用指向不同子类对象。


14. 类型转换

向上转换(自动)

子类 → 父类

安全:

cs 复制代码
Dog dog = new Dog();

Animal animal = dog;

向下转换(需要强制)

父类 → 子类

cs 复制代码
Animal animal = new Dog();

Dog dog = (Dog)animal;

15. is 判断类型

cs 复制代码
if(animal is Dog)
{
    Console.WriteLine("这是狗");
}

16. as 转换

cs 复制代码
Dog dog = animal as Dog;

if(dog != null)
{
    dog.Sound();
}

17. 继承实际案例

例如游戏开发:

父类:

cs 复制代码
class Character
{
    public int HP;

    public virtual void Attack()
    {
        Console.WriteLine("攻击");
    }
}

战士:

cs 复制代码
class Warrior : Character
{
    public override void Attack()
    {
        Console.WriteLine("挥剑攻击");
    }
}

法师:

cs 复制代码
class Mage : Character
{
    public override void Attack()
    {
        Console.WriteLine("释放魔法");
    }
}

调用:

cs 复制代码
Character c1 = new Warrior();

Character c2 = new Mage();

c1.Attack();

c2.Attack();

输出:

复制代码
挥剑攻击
释放魔法

18. 继承设计原则

适合继承:

例如:

复制代码
动物
 |
 狗

因为:

复制代码
狗 是 动物

不适合继承:

例如:

cs 复制代码
汽车
 |
 发动机

因为:

复制代码
发动机不是汽车

这种应该使用组合:

复制代码
class Car
{
    Engine engine;
}

19. 继承 vs 组合

特点 继承 组合
关系 is-a has-a
代码复用
耦合
灵活性
推荐程度 谨慎使用 优先考虑

现代 C# 开发中:

优先组合,谨慎继承。


20. C# 继承核心总结

关键字 作用
: 表示继承
virtual 允许重写
override 重写父类方法
base 访问父类
abstract 抽象类/抽象方法
sealed 禁止继承
protected 给子类访问
is 类型判断
as 安全转换

一句话总结

C# 继承让子类复用父类代码,并通过 virtual + override 实现多态,是面向对象设计中实现扩展和复用的重要机制。

继承通常和 封装、抽象、多态 一起构成 C# 面向对象编程的四大核心思想。

相关推荐
隔窗听雨眠4 分钟前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫8 分钟前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141919 分钟前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉16 分钟前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
leoZ2311 小时前
2026-09-09-springboot-cloud-deploy-pitfalls
java·前端·javascript·vue.js·人工智能·spring boot·后端
秦老师Q1 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php
驭渊的小故事2 小时前
多线程02
java·开发语言·jvm
阿里嘎多学长2 小时前
2026-09-09 GitHub 热点项目精选
开发语言·程序员·github·代码托管
君顾12 小时前
本地折扣卡 CPS 平台搭建:从系统架构到落地实战
java·开发语言·折扣卡
海上彼尚2 小时前
Cursor 模型的强度实测排行
前端·人工智能·后端