1、当类中声明虚函数时,编译器会在类中生成一个虚函数表
2、虚函数表是一个存储类成员函数指针的数据结构
3、virtual成员函数会被编译器放入虚函数表中
4、当一个类中存在虚函数时,则该类的每个对象中都有指向虚函数表的指针(vptr指针)
#include <iostream>
using namespace std;
class AA
{
public:
AA(int a = 0)
{
this->a = a;
}
//加了virtual关键字,编译器自动在类中生成一个虚函数表,用来存储虚函数指针
virtual void print()
{
cout<<"a = "<< a <<endl;
}
protected:
int a;
};
class BB:public AA
{
public:
BB(int a = 0,int b = 0)
{
this->a = a;
this->b = b;
}
//建议在子类中也加上virtual关键字
virtual void print()
{
cout<<"a = "<< a <<"b = "<< b <<endl;
}
protected:
int b;
};
void HowtoPrint(AA *pA)
{
//根据传递过来的对象,根据类中的vptr指针来调用相应的函数,如果类中没有vptr指针,则不会调用。
pA->print();
}
void main()
{
AA a1;
BB b1;
HowtoPrint(&a1);//调用父类中的函数
HowtoPrint(&b1);//调用子类中的函数
system("pause");
}