如何将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++默认构造的行为一致。Dereftrait的作用是让Rust自动将CabVehicle/PackerMoverVehicle解引用为Vehicle,这样你就可以直接写cv.lat而不是cv.vehicle.lat,模拟继承的字段访问方式。- 如果后续需要给这些类型添加方法,推荐使用trait定义共同行为来实现多态,这是Rust中替代继承多态的标准方式。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

