Skip to content

Latest commit

 

History

History

visitor

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

实现一段代码,每个动物都自我介绍了一遍。我们的目标是,只让Cat做出自我介绍,但是不使用dynamic_cast(或者针对shared_ptr也有dynamic_pointer_cast,区别在于尖括号内只需要类名,不需要指针类型)来判断。

采用dynamic_cast相比 visitor 模式有以下弊端。

  • 存在多个派生类需要做不同的事情的时候,多个ifdynamic_cast会导致性能低下,代码结构也会变得混乱。
  • 每次添加一个新的子类,都需要找到所有需要添加新分支的if
  • 添加关于所有类的一个新逻辑的时候,又需要针对所有类写一个if,不仅容易混乱,而且不利于编译器查漏补缺。

采用visitor有以下好处。

  • 因为这毕竟是一个O(1)跳转,不同的类只需要跳转一次就可以运行相应的函数(而不是用if一个一个尝试),性能高。
  • 当你添加一个新的子类的时候,只要你 visitor 接口的成员都是纯虚类,你很容易通过阅读所有编译错误来找出所有需要修改。
  • 添加关于所有的类的一个新的逻辑很容易,就是继承自接口,井井有条。