在多态的学习中发现了一个新的关键词 virtual 而众多多态的实现离不开这个关键词,但是其具体作用以及其作用的原理让人捉摸不透,今天简要捋清一下他的用法:
一. 虚函数的运用
首先我们先看一下下面这段代码:
以及其运行结果:
可以看到,基类指针指向的vfunc()函数调用的是子类中的vfunc();
这一过程是如何实现的?
首先,具有虚函数的类或者由含有虚函数的类派生的类会在编译器内部生成一个虚函数表,这个虚函数表储存这个类里所有的虚函数的地址,然后一个类中公用一个虚函数表,这个虚函数表实质上是一个指针数组,之后这个类的对象中,编译器会自动添加一个指针 _vptr 这个指针会自动指向虚函数表,当父类的对象指针指向子类时,父类的对象指针中的_vptr就会指向子类的虚函数表,这样便可以清晰的使用子类的虚函数
二. 虚析构函数
当父类的指针指向子类对象的地址的时候,删除这个父类函数时,会因为this指针指向父类,只调用父类的析构函数,而不析构子类,导致内存泄露,而将父类的析构函数变成虚函数之后,父类的指针便会调用子类的析构函数,然后编译器会自动在子类的析构函数中调用父类的析构函数,这样便可以完成全部内容的析构.
三. 虚继承
当一个类分别派生两个类,再由两个类派生成一个类的时候,调用最开始的基类的成员是,会出现二义性,此时只需要中间的两个基类改为虚继承,这样便可以共享基类,让整个多重继承中,只含有一组相同的成员,完成继承.