C++ - 多态实现原理

多态的实现举例

  • 看一下例子程序
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个字节存放虚函数表
    • 时间,对多态的函数执行的指令,会执行查虚函数表的一系列指令,导致有额外的时间上的开销。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容