您的位置:首页 > 其它

浅谈thrift TVirtual*

2015-10-18 15:46 260 查看
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<Devr *>(this)->foo();
}
}


class Derv:public virtualDevr<Derv>
{
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<Devr *>(this)->foo();
}
}


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

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


无限递柜最终会止于DefaultBase
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thrift