多态原理的探究
C++中多态的实现原理
当类中声明虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储类成员函数指针的数据结构
虚函数表是由编译器自动生成与维护的
virtual 成员函数会被编译器放入虚函数表中
存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr 指针)
class Parent
{
public:
Parent (int a =0)
{
this->a=a;
}
virtual void print()//① 第一个动手脚的地方 因为有virtua关键字,C++会特殊处理 虚函数表
{cout<<"parrent"<<endl;}
private:
int a;
};
class Child:public Parent
{
public:
Child(int a=0,int b=0):Parent(a)
{
this->b=b;
}
void print()
{cout<<"Child"<<endl;}
private:
int b;
};
void HowToPlay(Parent *base)
{base->print();
//②这里有多态发生
//效果:传来子类对象,执行子类功能,传来父类执行父类
//C++编译器根本不需要区分是子类对象还是父类对象
//父类对象和子类对象分别有vptr指针==》虚函数表==》找函数的入口地址
//迟绑定():只有运行这一块代码时,C++才去判断
| | |
|--|--|
| | |
}
void main()
{
Parent p1;//这里是最重要的动手脚的地方 提前布局
// C++编译器会添加一个vptr指针
Child c1;//子类也有一个vptr指针
HowToPlay(&p1);
HowToPlay(&c1);
return;
}