由华为面试而想到的一个知识点---virtual虚函数

由华为面试而想到的一个知识点---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
 
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szwm1010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值