C++模板技术实例(2) 静态多态

本文探讨了C++中的静态多态性,通过模板技术避免了运行时多态带来的性能损失。通常,多态使用虚函数实现,但在某些简单计算场景下,这可能导致效率降低。文中展示了如何利用C++模板创建静态多态的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  面向对象技术在当今的软件开发中占据有举足轻重的地位,大大提高了代码复用性和可维护性,然而,有利必有弊,C++的多态,实际上用的是一个look-up table,运行时动态查找函数入口点,显然,会有一定的性能损失,当实际运行的代码完成的功能是一个简单计算的时候,性能损失更是明显。

  这里我用C++模板的技术,完成一个静态的多态(Static Polymorphism):

  运行时多态:

  1. // 一般情况下,我们采用的是运行时多态,代码大致是这样的
  2. class Base
  3. {
  4. public:
  5.     virtual void method() { std::cout << "Base"; }
  6. };
  7. class Derived : public Base
  8. {
  9. public:
  10.     virtual void method() { std::cout << "Derived"; }
  11. };
  12. int main()
  13. {
  14.     Base *pBase = new Derived;
  15.     pBase->method(); //outputs "Derived"
  16.     delete pBase;
  17.     return 0;
  18. }

    静态多态(Static Polymorphism):

  1. // Static Polymorphism
  2. template <class Derived>
  3. struct base
  4. {
  5.     void interface()
  6.     {
  7.         // ...
  8.                   // static_case是编译期间完成类型映射,又可以减少运行时性能损失
  9.         static_cast<Derived*>(this)->method();
  10.         // ...
  11.     }
  12.          virtual ~base(){} // 为什么要用virtual,不用多解释了吧:)
  13. };
  14. struct derived : base<derived>
  15. {
  16.     void method() { std::cout << "Derived";}
  17. };
  18. int main()
  19. {
  20.          // 把子类作为模板参数,实例化一个模板
  21.     base<derived> *pBase = new derived();
  22.          // 调用基类的代理方法,注意,这个方法是inline的,不会有函数调用性能损失
  23.     pBase->interface(); //outputs "Derived"
  24.     delete pBase;
  25.     return 0;
  26. }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值