设为首页 收藏本站
查看: 877|回复: 0

[经验分享] 由华为面试而想到的一个知识点---virtual虚函数

[复制链接]

尚未签到

发表于 2016-6-7 08:03:16 | 显示全部楼层 |阅读模式
  由华为面试而想到的一个知识点---virtual虚函数
  
  下面是根据华为面试题目中的一个知识,自己些的程序测试
  #include<iostream>
using namespace std;

  class a
{
public:
//virtual void print()
void print()
{
cout <<1<<endl;
}
};

  class b:public a
{
public:
virtual void print()
{
cout <<2<<endl;
}
};

  class c:public b
{
public:
void print()
{
cout <<3<<endl;
}
};

  int main()
{
a *pa;
//pa=new b;
//pa->print();
pa=new c;
pa->print();
//b *pb;
//pb=new c;
//pb->print();

  
return 0;
}

  
  
  
  总结:
  C++里面是用虚函数来实现多态的。
  在基类用virtual声明的成员函数即为虚函数。
  在派生类中定义此函数,要求函数名,函数类型,函数参数个数和类型全部与积累相同,并根据派生类的需要重新定义函数体,当一个成员函数声明为虚函数后,其派生类中的同名函数都自动成为虚函数,无论是否加virtual关键字。
  用基类的指针或者引用指向派生类对象,通过基类的指针或者引用调用虚函数,实际执行的将是派生类对象中定义的虚函数。
  
  
  虚析构函数
  如果有一个基类的指针指向派生类对象,并且想通过该指针delete派生类对象,系统只会执行基类的析构函数,而不会执行派生类的析构函数,为避免这种情况的发生,往往把析构函数声明为虚的,此时,系统将先执行派生类对象的析构函数,然后再执行基类的析构函数。
  如果基类的析构函数声明魏虚的,派生类的析构函数也将自动成为虚析构函数,无论派生类析构函数声明中是否加virtual。
  
  
  
  纯虚函数和抽象类
  纯虚函数具有如下的一般形式
  virtual 返回类型 函数名(参数列表)==0;
  
  纯虚函数没有函数体,即只有函数的声明而没有函数的定义。
  通常在基类中声明纯虚函数,在派生类中定义该虚函数,如果派生类中也没有定义该虚函数,则该函数在派生类中仍为虚函数
  
  不能实例化对象的类从未抽象类,具有纯虚函数的类是不能实例化对象的,所以具有纯虚函数的类是一种抽象类。
  虽然抽象类不能实例化对象,都是可以用抽象类的指针指向派生类对象,并调用派生类的虚函数的实际实现。
  
  
  还有一个程序
  
#include<iostream>
using namespace std;
class CBase
{
public:
virtual void fun1()
{
cout<<1<<endl;
}
void fun2()
{
cout<<2<<endl;
}
};
class CDerived:public CBase
{
public:
void fun1()
{
cout<<3<<endl;
}
void fun2()
{
cout<<4<<endl;
}
};
void main()
{
CBase b;
CDerived d;
b=d;
b.fun1(); //3 //1
b.fun2(); //4 //2

CBase *pb=&b;
pb->fun1(); //1
pb->fun2(); //2

cout <<endl;

  pb=&d;
pb->fun1(); //3
pb->fun2(); //2

CDerived *pd=(CDerived *)&b;
pd->fun1(); //1
pd->fun2(); //4

cout<<endl;

  pd=&d;
pd->fun1(); //3
pd->fun2(); //4

CBase &b1=b;
b1.fun1(); //1
b1.fun2(); //2

cout<<endl;

  b1=d;
b1.fun1(); //3 //1
b1.fun2(); //2

CBase &b2=d;
b2.fun1(); //3
b2.fun2(); //2

}

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-227174-1-1.html 上篇帖子: 任正非:若爆发金融危机 华为现金可吃3个月 下篇帖子: 创意动手做:再也不用数据线,华为D1改装无线充电!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表