卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章47194本站已运行31112

C++ 内联函数与虚拟函数的异同

内联函数将函数体嵌入调用点,提升性能和代码体积,但可读性较低;虚拟函数通过多态性调用子类覆写的函数,提高灵活性,但运行时开销较高。

C++ 内联函数与虚拟函数的异同

C++ 内联函数与虚拟函数的异同

内联函数

内联函数是编译器在调用时将函数体嵌入到调用点,而不是执行函数调用过程的函数。

优点:

  • 提升性能:避免调用开销。
  • 减小代码体积:函数体不会重复出现在多个调用点。

缺点:

  • 编译时间增加:需要为每个调用点编译函数体。
  • 代码可读性下降:函数体分散在整个代码库中。

语法:

inline int sum(int a, int b) {
  return a + b;
}

虚拟函数

虚拟函数是通过继承机制实现多态性的函数。当调用父类对象上的虚拟函数时,实际调用的函数由对象的动态类型决定。

优点:

  • 实现多态性:子类可以重写父类的虚拟函数。
  • 提高代码的可扩展性和灵活性。

缺点:

  • 运行时开销:需要维护虚函数表和间接调用。
  • 代码复杂度增加:需要使用 virtualoverride 关键字。

语法:

class Base {
 public:
  virtual void print() {
    std::cout << "Base" << std::endl;
  }
};

class Derived : public Base {
 public:
  virtual void print() override {
    std::cout << "Derived" << std::endl;
  }
};

异同比较:

特征内联函数虚拟函数
调用机制函数体嵌入间接调用
性能更高较低
代码体积更小更大
可读性较低较高
多态性不支持支持

实战案例:

可以用内联函数实现简单的数学运算,例如求和:

inline int sum(int a, int b) {
  return a + b;
}

int main() {
  std::cout << sum(1, 2) << std::endl;  // 输出:3
}

可以用虚拟函数实现图形绘制接口:

class Shape {
 public:
  virtual void draw() = 0;
};

class Circle : public Shape {
 public:
  virtual void draw() override {
    std::cout << "Drawing a circle" << std::endl;
  }
};

int main() {
  Shape* shape = new Circle();
  shape->draw(); // 输出:Drawing a circle
}
卓越飞翔博客
上一篇: Golang函数指针和闭包的错误处理策略
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏