计算机二级C基础:虚拟构造函数的用处
来源:优易学  2011-12-9 21:18:28   【优易学:中国教育考试门户网】   资料下载   IT书店


  遍历被拷贝的NewsLetter对象中的整个component链表,调用链表内每个元素对象的虚拟构造函数。我们在这里需要一个虚拟构造函数,因为链表中包含指向NLComponent对象的指针,但是我们知道其实每一个指针不是指向TextBlock对象就是指向Graphic对象。无论它指向谁,我们都想进行正确的拷贝操作,虚拟构造函数能够为我们做到这点。
  虚拟化非成员函数
  就象构造函数不能真的成为虚拟函数一样,非成员函数也不能成为真正的虚拟函数。然而,既然一个函数能够构造出不同类型的新对象是可以理解的,那么同样也存在这样的非成员函数,可以根据参数的不同动态类型而其行为特性也不同。例如,假设你想为TextBlock和Graphic对象实现一个输出操作符。显而易见的方法是虚拟化这个输出操作符。但是输出操作符是operator<<,函数把ostream&做为它的左参数(left-hand argument)(即把它放在函数参数列表的左边),这就不可能使该函数成为TextBlock 或 Graphic成员函数。
  (这样做也可以,不过看一看会发生什么:
  class NLComponent {
  public:
  // 对输出操作符的不寻常的声明
  virtual ostream& operator<<(ostream& str) const = 0;
  ...
  };
  class TextBlock: public NLComponent {
  public:
  // 虚拟输出操作符(同样不寻常)
  virtual ostream& operator<<(ostream& str) const;
  };
  class Graphic: public NLComponent {
  public:
  // 虚拟输出操作符 (不寻常)
  virtual ostream& operator<<(ostream& str) const;
  };
  TextBlock t;
  Graphic g;
  ...
  t << cout; // 通过virtual operator<<
  //把t打印到cout中。
  // 不寻常的语法
  g << cout; //通过virtual operator<<
  印到cout中。
  //不寻常的语法
  类的使用者得把stream对象放到<<符号的右边,这与输出操作符一般的用法相反。为了能够回到正常的语法上来,我们必须把operator<<移出TextBlock 和 Graphic类,但是如果我们这样做,就不能再把它声明为虚拟了。)
  另一种方法是为打印操作声明一个虚拟函数(例如print)把它定义在TextBlock 和 Graphic类里。但是如果这样,打印TextBlock 和 Graphic对象的语法就与使用operator<<做为输出操作符的其它类型的对象不一致了,这些解决方法都不很令人满意。我们想要的是一个称为operator<<的非成员函数,其具有象print虚拟函数的行为特性。有关我们想要什么的描述实际上已经很接近如何得到它的描述。我们定义operator<< 和print函数,让前者调用后者!
  class NLComponent {
  public:
  virtual ostream& print(ostream& s) const = 0;
  ...
  };
  class TextBlock: public NLComponent {
  public:
  virtual ostream& print(ostream& s) const;
  ...
  };
  class Graphic: public NLComponent {
  public:
  virtual ostream& print(ostream& s) const;
  ...
  };
  inline
  ostream& operator<<(ostream& s, const NLComponent& c)
  {
  return c.print(s);
  }
  具有虚拟行为的非成员函数很简单。编写一个虚拟函数来完成工作,然后再写一个非虚拟函数,它什么也不做只是调用这个虚拟函数。为了避免这个句法花招引起函数调用开销,当然可以内联这个非虚拟函数。
  现在你知道如何根据它们的一个参数让非成员函数虚拟化,你可能想知道是否可能让它们根据一个以上的参数虚拟化呢?可以,但是不是很容易。

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训