实现一段代码,每个动物都自我介绍了一遍。我们的目标是,只让Cat
做出自我介绍,但是不使用dynamic_cast
(或者针对shared_ptr
也有dynamic_pointer_cast
,区别在于尖括号内只需要类名,不需要指针类型)来判断。
采用dynamic_cast
相比 visitor 模式有以下弊端。
- 存在多个派生类需要做不同的事情的时候,多个
if
和dynamic_cast
会导致性能低下,代码结构也会变得混乱。 - 每次添加一个新的子类,都需要找到所有需要添加新分支的
if
。 - 添加关于所有类的一个新逻辑的时候,又需要针对所有类写一个
if
,不仅容易混乱,而且不利于编译器查漏补缺。
采用visitor有以下好处。
- 因为这毕竟是一个O(1)跳转,不同的类只需要跳转一次就可以运行相应的函数(而不是用
if
一个一个尝试),性能高。 - 当你添加一个新的子类的时候,只要你 visitor 接口的成员都是纯虚类,你很容易通过阅读所有编译错误来找出所有需要修改。
- 添加关于所有的类的一个新的逻辑很容易,就是继承自接口,井井有条。