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

本文深入探讨了C++中虚函数的概念与应用,包括虚函数的基本语法、如何通过基类指针调用派生类的虚函数实现多态,以及虚析构函数、纯虚函数和抽象类的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值