重载父函数是否会规避多态性?

Does overloading a parents function circumvent polymorphism

本文关键字:多态性 函数 是否 重载      更新时间:2023-10-16

父类有一个可以接受任何子类作为参数的函数。我知道,如果子类与参数类型相同,则可以进行重大优化。有人告诉我,像dynamic_cast这样检查类型的东西是糟糕的设计。因此,我的解决方案是编写一个完全独立的函数,重载父函数并具有类型为child的参数。这是否以一种不好的方式规避了多态性?

class parent{
  virtual void foo(parent& bar) =0;
}
class child: public parent{
  void foo(parent& bar){
    //unoptimized code
  }
  void foo(child& bar){
    //optimized code
  }
}

如果在超类中声明为虚函数,则不会重写该函数。所有子类都继承父类中函数的virtual

你可以这样做

struct parent{
  virtual ~parent() = default;
  virtual void foo(parent& bar) = 0;
};
struct child: public parent{
  void foo(parent& bar) override {
    if (child* c = dynamic_cast<child*>(&bar)) {
        foo(*c); // call optimized code
        return;
    }
    //unoptimized code
  }
  void foo(child& bar){ // This one is not an override
    //optimized code
  }
};

或使用multidispatch

struct parent{
  virtual ~parent() = default;
  virtual void foo(parent& bar) = 0;
  virtual void foo_called_by(child& c) = 0;
  // other derived class as
  virtual void foo_called_by(child2& c) = 0;
};
struct child: public parent{
  void foo(parent& bar) override { bar.foo_called(*this); }
  void foo_called_by(child& bar) override {
    //optimized code
  }
  void foo_called_by(child2& bar) override {
    //unoptimized code
  }
};