编译时多态靠模板和函数重载,运行时多态靠虚函数;前者零开销,后者有虚表查表成本,选择取决于类型是否能在编译期确定。

C++ 编译时多态与运行时多态是什么?(如何根据需求权衡性能)

编译时多态靠模板和函数重载,运行时多态靠虚函数——前者零开销,后者有虚表查表成本,选哪个取决于你能不能在写代码时就确定类型。

什么时候该用 template 而不是虚函数

当你操作的对象类型在编译期完全已知,且不同类型的实现逻辑差异大、不共享公共接口时,template 是更自然的选择。比如容器类 std::vector<int>std::vector<std::string> 完全是两套独立生成的代码,互不影响。

为什么 virtual 函数不能是 inline 或模板成员

因为 virtual 的本质是运行时绑定,而 inline 是编译器对“确定调用目标”的优化提示,两者逻辑冲突;模板成员函数若声明为 virtual,编译器无法在实例化前确定虚表布局。

overridefinal 不只是语法糖,它们堵住了哪些坑

没有 override 时,拼错函数名、参数类型不匹配(比如把 const std::string& 写成 std::string&)、遗漏 const 限定符,都会悄无声息地创建新函数而非覆盖,导致多态失效。

虚函数调用的开销本身很小,但真正拖慢性能的往往是它带来的间接性和阻碍优化:编译器不敢内联、不敢向量化、难以做跨函数分析。而模板泛化一旦滥用,又会导致编译时间暴涨和链接时符号爆炸。权衡不在“快或慢”,而在“你是否需要在运行时接受未知类型”——如果答案是否定的,就别碰虚函数。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。