172210704111-陈国佳总结《2017年12月16日》【连续067天】
标题:多态的实现原理;
内容:多态的关键在于“动态联编”:
即编译时并不确定调用的虚函数,运行时才确定;
关键:虚函数表:
每一个有虚函数的类(或其派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。
虚函数表列出了该类的虚函数地址;
多态的函数调用语句编译后,指针指向对象的虚函数表地址,在虚函数表中找到虚函数地址,并调用虚函数的指令;
class A{
public:
virtual void Func(){cout<<"A::Func"<<endl;}
};
class B:public A{
public:
virtual void Func(){cout<<"B::Func"<<endl;}
};
int main()
{
A a;
A*pa=new B();
pa->Func();//64位程序指针为8字节
long long*p1=(long long*)&a;
long long*p2=(long long*)pa;
*p2=*p1;
pa->Func();
return 0;
}
通过改变对象的虚函数表,来影响多态的结果;
明日计划:练习;