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

C++语言 码拜 5年前 (2016-06-07) 432次浏览
大致就像下面这个例子写的那样。
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

引用:

本人他妈下午昏昏沉沉的用IDE在test的run和prerun来回跳转。

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

15

他这个纯虚函数的使用,相似于回调,你假如申明个回调可以达到一样的效果。

15

这种代码很常见的,只不过你这样实现纯虚函数肯定是不行的
子类只要实现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;
纯虚函数,鉴定完毕

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明问一下这个纯虚函数的实现有什么特别的意义吗
喜欢 (0)
[1034331897@qq.com]
分享 (0)