GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||
GeezerVison is showing notes.kamacoder.com — C++多态实现机制:编译时多态与运行时多态、虚函数表、动态绑定、override与final # C++多态的实现机制面试官问"C++多态是怎么实现的",很多人只答"虚函数+继承"就停了。但面试官真正想听的是底层怎么走的——vtable 在哪、vptr 什么时候初始化、调用链是怎样的。只说表面概念,面试官一定会追问到你答不上来。 把编译时多态和运行时多态分清楚,再把运行时多态的调用链讲明白,这道题就稳了。 # 简要回答C++ 多态分两种:编译时多态靠函数重载和模板,编译期就确定调用谁;运行时多态靠 virtual 函数 + 继承 + 基类指针/引用,运行时通过 vptr → vtable → 函数地址 动态绑定到正确的实现。 # 详细回答
运行时多态的三个必要条件:基类声明 虚函数调用的底层流程(以
这就是为什么基类析构函数必须声明为 virtual——否则
# 知识拓展Q:抽象类和纯虚函数是什么关系? 含有纯虚函数( Q:override 和 final 分别干什么?
Q:虚函数调用比普通函数慢多少? 多一次指针间接寻址(取 vptr + 查 vtable),在现代 CPU 上通常只差几纳秒。真正的性能损失不在寻址本身,而在于虚函数调用无法被内联优化。热路径上如果频繁调用小虚函数,可以考虑 CRTP(静态多态)替代。 Q:构造函数里能调虚函数吗? 能调,但不会多态。构造函数执行时 vptr 指向的是当前正在构造的类的 vtable,不是最终派生类的。所以在基类构造函数里调虚函数,调的是基类版本,不是派生类版本。 评论验证登录状态... | |||||||||||||||||||||
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |