请问这个纯虚函数的实现有什么特别的意义吗

就想叫yoko 2013-12-24 05:57:43
大概就像下面这个例子写的那样。。
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;
}


...全文
315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanke1311 2016-08-18
  • 打赏
  • 举报
回复
Effective c++上面说纯虚函数的确可以有自己的实现的,作为默认的缺省,然而我也看不懂为什么会允许这么二的规则``````
就想叫yoko 2013-12-25
  • 打赏
  • 举报
回复
引用 7 楼 vipcxj 的回复:

#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是不是反了?
函数名没反额,谢谢各位回帖,结了
worldy 2013-12-24
  • 打赏
  • 举报
回复
virtual void run() = 0; 纯虚函数,鉴定完毕
vipcxj 2013-12-24
  • 打赏
  • 举报
回复

#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是不是反了?
SKATE11 2013-12-24
  • 打赏
  • 举报
回复
删掉代码看起来干净点
  • 打赏
  • 举报
回复
这种代码很常见的,只不过你这样实现纯虚函数肯定是不行的 子类只要实现run函数就可以了,不用关心其他细节
pathletboy 2013-12-24
  • 打赏
  • 举报
回复
他这个纯虚函数的使用,类似于回调,你如果申明个回调可以达到一样的效果。
sublimepan 2013-12-24
  • 打赏
  • 举报
回复
引用 1 楼 q191201771 的回复:
我他妈下午昏昏沉沉的用IDE在test的run和prerun来回跳转。。。
derekrose 2013-12-24
  • 打赏
  • 举报
回复
纯虚函数还给实现了?然后还相互调用。。。 垃圾代码无疑
就想叫yoko 2013-12-24
  • 打赏
  • 举报
回复
我他妈下午昏昏沉沉的用IDE在test的run和prerun来回跳转。。。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧