面试题答案
一键面试- 动态分发与运行时多态性的原理
- 在Rust中,动态分发是通过trait对象来实现运行时多态性的。trait对象允许在运行时根据对象的实际类型来决定调用哪个方法,而不是在编译时就确定。
- 当我们创建一个trait对象(例如
Box<dyn SomeTrait>
)时,Rust会在运行时根据对象的实际类型查找对应的方法实现。这是因为trait对象在运行时会携带一个虚表(vtable),虚表中存储了实际类型对应的方法指针。
- 定义trait
上述代码定义了一个名为// 定义一个trait trait Animal { fn speak(&self); }
Animal
的trait,它有一个方法speak
,该方法没有具体实现,要求实现Animal
trait的类型必须实现speak
方法。 - 实现trait
这里定义了两个结构体struct Dog; struct Cat; impl Animal for Dog { fn speak(&self) { println!("Woof!"); } } impl Animal for Cat { fn speak(&self) { println!("Meow!"); } }
Dog
和Cat
,并分别为它们实现了Animal
trait的speak
方法。 - 创建和使用trait对象来达成动态分发
在fn main() { let animals: Vec<Box<dyn Animal>> = vec![Box::new(Dog), Box::new(Cat)]; for animal in animals { animal.speak(); } }
main
函数中,创建了一个Vec
,其中的元素是Box<dyn Animal>
类型的trait对象,分别放入了Dog
和Cat
的实例。在遍历这个Vec
时,调用speak
方法,由于动态分发,实际调用的是Dog
或Cat
对应的speak
方法实现,从而实现了运行时多态性。