likes
comments
collection
share

C++如何实现多态

作者站长头像
站长
· 阅读数 6

多态实现的三个条件:

1)要有继承

2)要有虚函数重写

3)要有父类指针(父类引用)指向子类对象

编译器发现一个类中有虚函数,便会立即为此类生成虚函数表vtable。虚函数表的各表项为指向类里面的虚函数的指针。编译器还会在此类中隐含插入一个指针vptr(对 vc 编译器来说,它插在类的内存地址的第一个位置上)指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr 与 vtable 的关联代码,即将vptr 指向对应的 vtable,将类与此类的vtable 联系了起来。

另外在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的this 指针,这样依靠此 this 指针即可得到正确的 vtable,如此才能真正与函数体进行连接,这就是动态联编,实现多态的基本原理。

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;

class Father
{
public:
    void Face()
    {
        cout << "Father's face" << endl;
    }

    virtual void Say()
    {
        cout << "Father say hello" << endl;
    }
};

class Son:public Father
{
public:    
    void Say()
    {
        cout << "Son say hello" << endl;
    }
};

void main()
{
    Son son;
    Father *pFather=&son; //隐式类型转换
    pFather->Say();
}

对于Father *pFather=&son; 此时指向基础类的指针pFather已经变成指向具体的类son的this指针,那么我们调用这个pFather父类指针,就相当于调用了等号右边的类即子类son的this指针,这个this所能调用的函数,自然就是子类son本身的函数。即pFather->Say();这行代码调用的是子类的Say()函数。因此我们就成功的实现了用父类指针pFather调用子类函数,也就是实现了多态。