重载父函数是否会规避多态性?
Does overloading a parents function circumvent polymorphism
父类有一个可以接受任何子类作为参数的函数。我知道,如果子类与参数类型相同,则可以进行重大优化。有人告诉我,像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
}
};
相关文章:
- 从基类调用函数的多态性
- C++多态性:有没有办法找到对象成员函数的地址?
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 多态性在 lambda 函数C++不起作用
- 多态性是否适用于值?或者在按(基)值返回时使用派生类的移动构造函数
- 如何在保持多态性的同时,将成员函数添加到需要它的继承类中,而不会影响其他同级类?
- C++ 中多态性和函数重载之间的区别
- 函数模板和多态性
- C 多态性实例的构造函数和破坏者
- 多态性(C )的派生类中的超载函数
- 多态性和纯虚函数
- C++ 多态性和非虚函数
- C++多态性/虚拟函数在此不起作用
- 如果重载函数仅被部分重写,则多态性不起作用
- 多态性不适用于相同数据类型(Base和Inherited类)的函数返回值
- 具有引用数据类型的函数多态性
- c++在没有虚拟析构函数的多态性中共享ptr
- 静态多态性中的纯抽象函数等价物是什么
- C++链表/多态性未运行列表函数