多态的实现举例
- 看一下例子程序
class Base{
public:
int i;
virtual void Print(){out<<"Base:Print";}
};
class Derived:public Base{
public:
int n;
virtual void Print(){out<<"Derived:Print"<<endl;}
}
int main(){
Derived d;
cout<<sieof(Base)<<","<<sizeof(Derived);
return 0 ;
}
输出结果:8,12
比正常输出多出了4个字节。
多态实现原理
- 每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。虚函数表中列出了该类的虚函数地址。多出来的4歌字节就是用来放虚函数表的地址的。
pBase.png
pDerived.png
多态的关键 -- 虚函数表
- 多态的函数调用语句被编译成一系列根据基类指针所指向的(或基类引用所引用的)对象中存放的虚函数表的地址,在虚函数表中查找虚函数地址,并调用虚函数的指令。
多态存在的问题
- 会在编译期间造成额外的时间和空间上的开销
- 空间,每一个有虚函数类的对象都会多4个字节存放虚函数表
- 时间,对多态的函数执行的指令,会执行查虚函数表的一系列指令,导致有额外的时间上的开销。
网友评论