适当调用派生 class

Call derived class appropriately

我有一个 class order 和两个派生的 classes:single_orderrepeated_order.

struct order{
string desc;
};
struct single_order : public order{
datetime dt;
};
struct repeated_order : public order{
datetime dt1;
datetime dt2;
};

我有一个 list<order*> ll 可以包含 single_orderrepeated_order 以及两种方法:

bool is_expired(single_order &el){
   if(today>el.dt){
      //do something
   }
}
bool is_expired(repeated_order &el){
   if(today>el.dt1){
      //do something
   }
   if(today>el.dt2){
      //do something else
   }
}

我想遍历 ll 并在每种情况下调用最合适的方法。 (两个函数的参数也可以不是引用)

怎么做?

您知道标记多态性,但您似乎对这个概念感到困惑。 这是一些代码:

#include <iostream>
#include <memory>
#include <vector>

class Base {
 public:
  Base() = default;
  virtual ~Base() = default;
  virtual void do_foo() = 0;
};

class Bar : public Base {
 public:
  Bar() = default;
  void do_foo() override { std::cout << "From Bar\n"; }
};

class Baz : public Base {
 public:
  Baz() = default;
  void do_foo() override { std::cout << "From BAZ\n"; }
};

int main() {
  std::vector<std::unique_ptr<Base>> v;

  v.emplace_back(new Bar());
  v.emplace_back(new Baz());

  for (const auto& i : v) {
    i->do_foo();
  }
}

你可以看到在Base中有一个纯虚函数,virtual do_foo() = 0;这意味着一些事情。 Base 是一个纯虚拟 class,您不能声明 Base 对象,只能声明指向 Base 的指针或引用。为了拥有一个具体的 class,或者您可以为其创建对象的对象,您需要重写那些纯虚函数。

您有一个函数希望能够在两种派生类型上调用。这是多态性如何让您的生活更轻松的完美示例。您可以看到每个派生的 class 都覆盖了纯虚函数并做自己的事情,然后我可以将两个派生类型存储在我的 main() 函数的向量中,并调用适当的函数每个对象。

输出:

❯ ./a.out 
From Bar
From BAZ