Yes. And that's precisely how you would do it. When structs impl this trait, they only need to provide a definition for visit_a.
impl Visitor for Struct {
fn visit_a(&mut self, a: A) {
// ...
}
}
All methods in a trait always resolve to the one in the impl of the struct. Don't think of it as inheritance and overriding, rather think of it as if the definition of visit is copied and pasted into every impl where you do not explicitly define it.
Correct. This is all statically dispatched. Though that's a bit orthogonal to the question;
Dynamic dispatching occurs if a function is explicitly written to take a &dyn Visitor (or Box<dyn Visitor>, or other similar pointer type); this is known as a trait object. Even then, when visit is called on the trait object, it will be able to call the methods from each type (because you'll be calling the version of visit that was generated for that specific type), and can even be overridden itself.