有关于虚函数的问题

上次有个师兄给推荐了个工作,由于公司远在深圳,所以他们老大只能以电话面试的方式进行考查(呵呵,逃过一劫啊),结果是聊了很多问题,就是感觉他们老大对于虚函数好像很感兴趣,我以前也大概看过一些虚函数的文章,反正是给蒙过去了,现在有大概上网看了下,现在对虚函数总结一下。

虚函数我感觉就是之所以叫虚函数是因为加上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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值