https://blog.csdn.net/dashuniuniu/article/details/50162903
https://www.cnblogs.com/lvdongjie/p/4489907.html
当类中的虚函数都为inline时,编译器不知道将虚表在哪一个编译单元进行展开,所以会选择在每一个用到实现虚函数的子类所在的编译单元都会生成一份。但是使用outline以后,编译器只会在第一个实现定义outline的编译单元里面生成唯一的虚表。

outline对应inline

只要不是所有虚函数都是inline,那么第一个定义outline的编译模块就会生成唯一的虚表。这样,在包含类的头文件以后,链接器就可以正常链接虚表。