You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C++继承机制移植到Rust?附示例代码改写需求

将C++继承风格的代码转为Rust实现

Rust没有C那样的类继承机制,通常用**组合(Composition)**替代继承实现代码复用。针对你提供的C代码(子类仅继承基类数据,无额外成员/方法),可以通过结构体嵌套结合Deref trait来模拟类似继承的字段访问体验。

完整实现代码

use std::ops::{Deref, DerefMut};

// 定义基础的Vehicle结构体,包含所有公共字段
#[derive(Debug, Default)]
struct Vehicle {
    lat: f64,
    lon: f64,
    alt: f64,
    speed: f64,
}

// 定义CabVehicle,嵌套Vehicle作为其核心字段
#[derive(Debug, Default)]
struct CabVehicle {
    vehicle: Vehicle,
}

// 定义PackerMoverVehicle,同样嵌套Vehicle
#[derive(Debug, Default)]
struct PackerMoverVehicle {
    vehicle: Vehicle,
}

// 给CabVehicle实现Deref,允许自动解引用到Vehicle
impl Deref for CabVehicle {
    type Target = Vehicle;

    fn deref(&self) -> &Self::Target {
        &self.vehicle
    }
}

// 实现DerefMut,允许可变访问Vehicle的字段
impl DerefMut for CabVehicle {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.vehicle
    }
}

// 对PackerMoverVehicle做同样的解引用实现
impl Deref for PackerMoverVehicle {
    type Target = Vehicle;

    fn deref(&self) -> &Self::Target {
        &self.vehicle
    }
}

impl DerefMut for PackerMoverVehicle {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.vehicle
    }
}

fn main() {
    let mut cv = CabVehicle::default();
    cv.lat = 12.34;
    cv.lon = 12.34;
    cv.alt = 12.34;

    let mut pmv = PackerMoverVehicle::default();
    pmv.lat = 12.34;
    pmv.lon = 12.34;
    pmv.alt = 12.34;

    // 可选:打印验证数据
    println!("Cab Vehicle: {:?}", cv);
    println!("Packer Mover Vehicle: {:?}", pmv);
}

关键说明

  • #[derive(Default)]自动生成默认构造逻辑,让我们可以用::default()创建初始值为0.0的实例,和C++默认构造的行为一致。
  • Deref trait的作用是让Rust自动将CabVehicle/PackerMoverVehicle解引用为Vehicle,这样你就可以直接写cv.lat而不是cv.vehicle.lat,模拟继承的字段访问方式。
  • 如果后续需要给这些类型添加方法,推荐使用trait定义共同行为来实现多态,这是Rust中替代继承多态的标准方式。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:25:48