找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1474|回复: 0
打印 上一主题 下一主题
收起左侧

C++标准编程:虚函数与内联

[复制链接]
跳转到指定楼层
楼主
ID:107189 发表于 2016-3-5 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 我们曾经在讨论C++的时候,经常会问到:“虚函数能被声明为内联吗?”现在,我们几乎听不到这个问题了。现在听到的是:“你不应该使print成为内联的。声明一个虚函数为内联是错误的!”
  这种说法的两个主要的原因是(1)虚函数是在运行期决议而内联是一个编译期动作,所以,我们将虚函数声明为内联并得不到什么效果;(2)声明一个虚函数为内联导致了函数的多分拷贝,而且我们为一个不应该在任何时候内联的函数白白花费了存储空间。这样做很没脑子。
  不过,事实并不是这样。我们先来看看第一个:许多情况下,虚拟函数都被静态地决议了——比如在派生类虚拟函数中调用基类的虚拟函数的时候。为什么这样做呢?封装。一个比较明显的例子就是派生类析构函数调用链。所有的虚析构函数,除了最初触发这个析构链的虚析构函数,都被静态的决议了。如果不将基类的虚析构函数内联,我们无法从中获利[a]。这和不内联一个虚拟析构函数有什么不同吗?如果继承体系层次比较深并且有许多这样的类的实例要被销毁的话,答案是肯定的。
  再来看另外一个不用析构函数的例子,想象一下设计一个图书馆类。我们将MaterialLocation作为抽象类LibraryMaterial的一个成员。将它的print成员函数声明为一个纯虚函数,并且提供函数定义:它输出MaterialLocation。
  class LibraryMaterial {
  private:
  MaterialLocation _loc; // shared data
  // …
  public:
  // declares pure virtual function
  inline virtual void print( ostream& = cout ) = 0;
  };
  // we actually want to encapsulate the handling of the
  // location of the material within a base class
  // LibraryMaterial print() method - we just don’t want it
  // invoked through the virtual interface. That is, it is
  // only to be invoked within a derived class print() method
  inline void
  LibraryMaterial::
  print( ostream &os ) { os 《 _loc; }
  接着,我们引入一个Book类,它的print函数输出Title, Author等等。在这之前,它调用基类的print函数(LibraryMaterial::print())来显示书本位置(MaterialLocation)。如下:
  inline void
  Book::
  print( ostream &os )
  {
  // ok, this is resolved statically,
  // and therefore is inline expanded …
  LibraryMaterial::print();
  os 《 "title:" 《 _title
  《 "author" 《 _author 《 endl;
  }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表