上次有个师兄给推荐了个工作,由于公司远在深圳,所以他们老大只能以电话面试的方式进行考查(呵呵,逃过一劫啊),结果是聊了很多问题,就是感觉他们老大对于虚函数好像很感兴趣,我以前也大概看过一些虚函数的文章,反正是给蒙过去了,现在有大概上网看了下,现在对虚函数总结一下。
虚函数我感觉就是之所以叫虚函数是因为加上virtual 就是给这个函数给虚化了,以免到时候调用其基类重载函数的时候,它又跳出来作怪。
程序如下所示:
#include <stdlib.h>
#include <iostream.h>
class base
{
public:
virtual void printt()
{cout <<"this is father" <<"/n";}
};
class child : public base
{
public:
void printt()
{cout <<"this is child" <<"/n";}
};
main()
{
base *b_a,*b_b,*a=new base;
child *c=new child;
b_a=a;
b_b=c;
b_a->printt();
b_b->printt();
}
当不加virtual的时候,结果是this is father
this is father
当加了virtual的时候,结果是this is father
this is child
原因是这样的,程序默认的时候都是执行静态编译,但由于b_b指针即可指向基类中的函数又可指向派生类中的重载函数,所以根据普遍性原则,b_b会指向基类中的函数,所以就会显示第一个结果,但是如果加上virtual就会提示编译器进行动态编译所以在此处程序就会知道用户需要指向的是派生类中的重载函数。
如果用户直接定义派生类的指针,并把派生类对象地址赋值给它,那么就相当于直接告知程序调用派生类中的重载函数,因此直接静态编译即可,不需要虚函数了,呵呵。
代码如下:
#include <stdlib.h>
#include <iostream.h>
class base
{
public:
void printt()
{cout <<"this is father" <<"/n";}
};
class child : public base
{
public:
void printt()
{cout <<"this is child" <<"/n";}
};
main()
{
base *a=new base;
child *c=new child;
//b_a=a;
//b_b=c;
a->printt();
c->printt();
}
运行结果为
this is father
this is child