大致就像下面这个例子写的那样。
test::run是作者遗留下来的垃圾吗
test::run是作者遗留下来的垃圾吗
#include <stdio.h> class test { public: virtual void run() = 0; virtual void prerun(); }; inline void test::run() { printf("test::fun()\n"); prerun(); } void test::prerun() { run(); //some code here } class test_impl : public test { public: virtual void run() { printf("test_impl::run()\n"); } }; int main() { test *t = new test_impl(); t->prerun(); delete t; return 0; }
解决方案
15
纯虚函数还给实现了?然后还相互调用。 垃圾代码无疑
15
15
他这个纯虚函数的使用,相似于回调,你假如申明个回调可以达到一样的效果。
15
这种代码很常见的,只不过你这样实现纯虚函数肯定是不行的
子类只要实现run函数就可以了,不用关心其他细节
子类只要实现run函数就可以了,不用关心其他细节
15
删掉代码看起来干净点
15
#include <stdio.h> class test { public: virtual void run() = 0; /*virtual*/ void prerun(); //将virtual注释掉可能更清晰吧,也就是说不要覆盖prerun() }; /* 本人一直以为实现纯虚函数是不合法的,你竟然实现了还能正常编译,太不科学了 inline void test::run() { printf("test::fun()\n"); prerun(); } */ void test::prerun() { run(); //prerun()调用run,这个run原因是是虚的,所以动态决定。 //some code here } class test_impl : public test { public: virtual void run() //你这里实现了本人的run() { printf("test_impl::run()\n"); } }; int main() { test *t = new test_impl(); t->prerun();//这里t虽然是基类test指针,但内部其实调用 test_impl 中你实现的run函数 //这样假如你有很多个继承test的子类test_implN,那么使用统一的代码t->prerun就能实现统一的功能。基本就是这用处。 delete t; return 0; }
本人的理解都在注视中了。最后本人感觉你俩函数名prerun和run是不是反了?
10
virtual void run() = 0;
纯虚函数,鉴定完毕
纯虚函数,鉴定完毕