C++ 继承模板类(参数是子类)替代虚函数。模板类只能访问子类公共成员,受保护的不行

派生类能访问基类的 protected 成员,但是反过来不可以。不要想着用什么简单的方法来代替虚函数。
■网友
这是CRTP (curiously recurring template pattern,https://en.m.wikipedia.org/wiki/Curiously_recurring_template_pattern)。通过把建立虚函数表vtable的过程搬到编译时间来提高效率。对于多次重复调用的函数,性能提高还是很客观的。很多优秀的模版库都在用这个pattern,比如Eigen library.父类access子类的protected或者private 函数问题,我用的是最普遍的解决方式:加上 friend。当然如果多层继承,每一个子类都要加调用他的父类为friend,这很麻烦,但鉴于子类最好将实现设为private,也只能这样了。还有另外的方法比如设一个中间非模版accessor类,通过它来传递friendship。对我个人而言,不是很喜欢。这篇文章里:https://accu.org/index.php/journals/296 把我以上说的都讲的很清楚,值得一看。文章里还有一个偏方,是用函数指针,不用任何friend。娱乐一下就好了,我觉得实际上不适用。第一,子类必须是protected不能是private;第二,成员函数指针编译器优化不好。


    推荐阅读