没有虚拟的多态行为

Polymorphic behaviour without virtual

本文关键字:多态 虚拟      更新时间:2023-10-16

I这是不使用任何虚拟函数的简单继承的一个很好的实现。

为什么我希望这样:避免在性能关键代码中进行虚拟继承一个boost::变体肯定会在这里有所帮助,但我只想要标准的c++东西:-)

我也参考这个答案链接

#include <iostream>
using namespace std;
struct C;
struct B;
class A{
    public:
    A(int r): type(r){}
    int type;
    void deleter();
    protected:
    ~A(){std::cout << "DTOR A" << std::endl;}
};
class B: public A{
    public:
    B():A(1){};
    ~B(){std::cout << "DTOR B" << std::endl;}
};
class C: public A{
    public:
    C():A(2){};
    ~C(){std::cout << "DTOR B" << std::endl;}
};
void A::deleter(){
     if(type==1){
        delete static_cast<B* const>(this);
    }else if(type==2){
        delete static_cast<C* const>(this);
    }
}
int main(){
      A * a = new B();
      a->deleter();
}

我想使用基指针a。主要的问题是当我们想要delete a时该怎么办。我只是通过保护ADTOR来禁止这种情况。因此,使用此构造的唯一方法是调用a.deleter()来安全地删除bas类指针。这是一个安全和良好的实施,还是有更好的方法?

http://ideone.com/pd88xy

您引用了一条准则"避免性能关键代码中的虚拟继承"。这不是一个糟糕的指导方针,但不是最好的措辞。

真正的规则是"避免性能关键代码中的运行时多态性"。运行时多态性会导致性能下降。如果编译器不知道被提前调用的确切函数,那么它就无法跨函数进行优化。(分支预测有帮助,但仍远不如依赖内联的优化)

为了获得高性能和多态性,请将多态性提升到任何循环之外。如果唯一的多态调用是针对大型操作的,那么您不会经常为多态性付出代价。

模板(编译时多态性)可以帮助编写没有代码重复的小操作。然后使用动态调度技术来选择一个高度优化的模板实例。在这一点上,您使用哪种动态调度技术并不重要。虚拟调用,在std::function中键入擦除,或者您自己的函数指针表。因为与实际工作相比,动态调度操作较小。