虚函数的作用

来源:互联网 发布:热云数据融资 编辑:程序博客网 时间:2024/06/04 08:40

在某基类中申明为virtual的成员函数,并在一个或多个派生类中被重新定义,通过指向派生类的指针或引用,访问派生类中同名覆盖的成员函数。简单的说:那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性


面试1:除了指针能引起多态,还有什么能引起多态?

这是面试的时候常问题目,引起多态方式有两种 :指针和引用


面试2:重载,重写,覆盖

重载这里就不讲了。   注意不同面试官会有不同叫法,其实重写就是覆盖,覆盖就是重写


虚函数的格式:

virtual void fun(int a)


下面举个虚函数实现多态的例子:

class A{    public:        virtual void print(){cout<<"This is A"<<endl;}   //基类声明为虚函数};class B : public A{    public:    void print(){cout<<"This is B"<<endl;}               //继承A后,同函数也就成了虚函数};int main(){    A a;    B b;    A *p1 = &a;    A *p2 = &b;    p1->print();    p2->print();    return 0;}

这里输出的结果就是This is A和This is B了。


上面输出的结果就是多态产生的


多态实现的机制:

         由于这两个类中有虚函数存在,所以编译器就会为他们两个分别插入一段你不知道的数据,并为他们分别创建一个表。那段数据叫做vptr指针(虚函数指针),指向那个表。那个表叫做vtbl(虚函数表),每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址,

        首先是取出vptr的值,这个值就是vtbl的地址,再根据这个值来到vtbl这里,由于调用的函数A::fun()是第一个虚函数,所以取出vtbl中第一个值即为第一个虚函数的地址,这个值就是A::fun()的地址了,最后调用这个函数。现在我们可以看出来了,只要vptr不同,指向的vtbl就不同,而不同的vtbl里装着对应类的虚函数地址,所以这样虚函数就可以完成它的任务。


原创粉丝点击