具有类层次结构时按什么顺序调用方法

In what order are methods called when you have class hierarchy?

本文关键字:什么 顺序调用 方法 层次结构      更新时间:2023-10-16

考虑:

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 是一个虚拟函数,但是当您有这样的指针时,我不确定如何处理类层次结构。 是否有任何关于类层次结构的提示可以使处理各种继承类的问题更容易理解?

谢谢。

一旦你整理了Laptop *s = d;中的错误(见static_cast<>()),你会发现HPdv6remaining_time()会被调用,Laptoppower_save()会被调用。

为了简化起见,通过从HPdv6开始并沿着继承树向上移动直到找到该方法来解决函数。 IPad不会被使用,因为它不会出现在HPdv6Laptop之间,它位于一个单独的分支中。

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