4

考虑:

class Mobile {
  double memory_util;
  public:
  virtual void power_save(double duration) = 0;
};

class Laptop : public Mobile {
  bool is_unlocked;
  protected:
  bool is_charged;
  public:
  void power_save(double duration);
  virtual double remaining_time();
};

class NegativeNumber {}; 
class IPad : public Laptop {
  int generation;
  public:
  void power_save(double duration);
  bool isJailBroken();
};

class HPLaptop : public Laptop {
  int warranty_years; 
  public:
  void extend_warranty(int years);
};

class HPdv6 : public HPLaptop {
  bool repaired;
  public:
  double remaining_time(){  return HPLaptop::remaining_time();  }
  bool is_repaired { return repaired; }
};

您想要执行以下操作:

int main () {
  Mobile* d = new HPdv6();
  Laptop *s = d;
  d->power_save(100);
  cout << “remaining operation time: ” <<
  s->remaining_time() << endl;
  return 0;
}

这里实际上会调用哪些方法?我知道 Mobile 是一个虚函数,但是当你有这样的指针时,我不确定如何处理类层次结构。是否有任何关于类层次结构的技巧可以使处理各种继承类的问题更容易理解?

谢谢你。

4

1 回答 1

3

一旦您解决了Laptop *s = d;(参见static_cast<>())中的错误,您会发现HPdv6'sremaining_time()会被调用并且Laptop'spower_save()会被调用。

为了过度简化,函数是通过从HPdv6继承树开始并向上遍历直到找到方法来解决的。IPad不会被使用,因为它没有出现在HPdv6and之间Laptop,它位于一个单独的分支中。

如果您想要非过度简化的版本,请查找vtables. 这是关于它们的维基百科文章:http ://en.wikipedia.org/wiki/Virtual_method_table

于 2012-12-13T05:11:36.247 回答