开发工具与关键技术: Visual Studio / C++
作者:何文涛
撰写时间:2019-5-27
虚函数是指使用了修饰符virtual修饰过后的函数,而且定义虚函数的函数必须为类的成员函数,虚函数被继承后所继承的派生类都是为虚函数,友员函数不能被定义为虚函数,但是可以被定义为另外一个类的友员,析构函数可以定义为虚函数,但是构造函数却不能定义为虚函数。
虚函数例子:
如图所示,
图中所示,定义了三个类,分别是类Ared,类Bred和类Cred其中类类Bred和类Cred
都是继承于类Ared的,并且基类Ared构造函数定义了int的变量A,而派生类Bred定
义了两个变量A和B其中A是继承于基类Ared,派生类Cred也同样继承基类的A并且定
义了一个变量C。
这里定义了三个多态Cout来进行输出结果,分别输出的是基类的a,派生类b和派生类c
Main函数部分:
void main()
{
Ared A(5); Bred B(5, 6); Cred C(5, 7);
Ared S;
S = &A; S->Cout();
S = &B; S->Cout();
S = &C; S->Cout();
}
main主函数部分,分别定义了类Ared,Bred和Cred的对象,并且进行了赋值
在定义基类的指针S并且指向了基类A和其余两个派生类并且用指针多态访问了基类和两个派生类。
以上是输出结果,基类Ared输出的是本身的A的值,而类B和类C输出的是本身派生类的
值,输出的是这个结果是因为把类定义为虚函数,基类被定义为虚函数那么派生类也成了
虚函数,否则没被定义为虚函数的话那么其余两个派生类输出的结果是基类的A的值
虚析构函数:
作用:虚析构函数,能够使派生类对象在不同状态下正确调用析构函数
析构函数可以被定义为虚函数,虚析构函数用在delete释放内存正确析构动态对象。而构造函数不能定义为虚函数是因为建立一个派生类时候是必须要从类层次开始继承,然后逐个的把基类的构造函数调用。
虚析构函数例子:
如图所示,
图中的例子,图一定义了两个类分别是类A和类B而且类B继承于类A
类A和类B分别定义了构造函数和析构函数。
并且类A定义了析构函数是添加了virtual修饰符所以是个虚构造函数
,理所当然派生类也是一个虚构造函数。
Main主函数里面为类a和 b分别创建分配了内存空间,然后delete
调用了类B和类A的虚析构函数,由于加了virtual修饰了虚析构函数
所以在delete释放a的内存时候会把派生类B的析构函数也调用了
否则用普通的析构函数则不会被调用。
右边是输出结果,首先delete释放a内存调用了析构函数,由于是虚析
构函数所以连同派生类的内存也一起析构了,然后再调用派生类B虚析构函
数析构了*b。