4.2.2 Rust 为何没有继承?

02-Rust 为何没有继承?— Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.html

4.2.2 Rust 为何没有继承?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
pub struct Id {
    pub id: u32
}

impl Id {
    // 方法
}

// 🔨❌,Rust 没有继承!
pub struct Data: Id {
    // 继承来的 "id" 字段
    pub name: String,
}

impl Data {
    // 方法,但也包含 Id 的方法,或者可能是对这些方法的覆盖。
}

// ✅
pub struct Data {
    pub id: Id,
    pub name: String,
}

impl Data {
    // Data 上所有非来自 trait 的方法。
}

impl SomeTrait for Data {
    // 在单独的 impl 块中为 trait 写实现。
}
  • 继承带来若干缺点。

  • 默认就是异构的:

    类继承隐式允许不同类的类型互换使用,却无法指定具体类型,或判断某类型是否与另一类型相同。

    对于相等或比较这类操作,这会导致比较与相等检查抛错或以其它方式 panic。

  • 数据结构由什么组成、如何行为,有多个「真相来源」:

    类型的字段被继承层次遮蔽。

    类型的方法可能覆盖父类型,也可能被子类型覆盖;在多方维护的复杂代码库中,很难看清一个类型真正的行为。

  • 默认使用动态分发,带来虚表(vtable)查找开销:

    动态分发要工作,就需要某处存放「调用哪些方法」以及该类型其它运行时才知道的信息。

    这个存放处就是值的 vtable。与编译期已知类型的方法调用相比,方法调用需要更多次解引用。

最后修改 August 11, 2026: 更新 (70a5af133)