浅谈thrift TVirtual*

thrift中的TVirtualTransport实现方式比较奇怪,没有用一般的方法——把函数定义成虚函数,来实现多态。这种实现我实在是想不出有什么好处,所以我就认为是作者故意在卖弄奇技淫巧。下面介绍它的原理:

class Base
    { public: void foo() { foo_virt(); }
            virtual void foo_virt(){}
    }
template<typename Devr, typename super = DefatulBase>
class virtualDevr:public super
{
    virtual void foo_virt()
    {
        static_cast(this)->foo(); 
    }
}
class Derv:public virtualDevr 
{
    public:
    //foo is non-virtual
    void foo()
    {
    //do actual thing
    }
}

其实上面代码的功能与下面是等价的:

 class Base
{
        public:
            virtual foo(){}
}

class Derv:public Base
{
    public:
        foo()
        {
        // do actual thing
        }
}

更严重的是,thrift中的方法会有无限递归的问题
假设

template<typename Devr, typename super = DefatulBase>
Class virtualDevr:public super
{
    virtual void foo_virt()
    {
        static_cast(this)->foo(); 
    }
}

没有指定DefatulBase,而且子类Derv忘记定义foo方法了,那么当多态时调用Base的foo,就会出现无限递归,thirft作者也想到了这一点,于是加了DefaultBase,

class DefaultBase: public Base
{
    public:
        void foo()
        {
            //do some default action
        }
}

无限递柜最终会止于DefaultBase

你可能感兴趣的:(thrift)