thrift的默认传输类TTransportDefaults和虚拟传输类TVirtualTransport

默认传输类TTransportDefaults提供了抽象类TTransport的默认实现,实现了非虚拟的方法 (*_virt) read(), readAll(), write(),borrow() and consume()。基类TTransport总是调用对应的 虚拟函数,而默认传输类按照默认的方式实现而不去自己在覆盖哪些对应的虚拟函数了。

其实这个 默认传输类的主要作用是作为虚拟传输类TVirtualTransport的父类,那么为什么需要这个类作为虚拟 传输类的父类而不是直接采用抽象基类?由下面介绍虚拟基类的实现方式来决定的,因为为了避免采用 虚基类,所以虚拟传输类采用了模板的方式来实现多继承(同时从两个类继承),也就是说可以从一个 默认的类继承,而另一个类采用模板参数传递。而默认传输类的作用就是防止那些没有实现默认传输类 实现的方法的子类造成递归调用(死循环了)。

虚拟传输类的实现方式已经在上面介绍了,这样实 现的好处就是避免了采用虚拟继承,而虚拟继承会造成一定性能的损失。下面是虚拟基类的实现代码( 省略部分函数):

template <class Transport_, class 

Super_=TTransportDefaults>
class TVirtualTransport : public Super_ {
 public:
  //实现虚拟函数来调用模板参数传递进来的具体某一个传输类的非虚拟函数
  virtual uint32_t read_virt(uint8_t* buf, uint32_t len) {
    return static_cast<Transport_*>(this)->read(buf, len);
  }
   ......
}

费了这么大的皱褶就为了摆脱虚拟继承,看样子想要提高代码执行的效率确实不是那么简单 的事情,不过也证明了一点,巧妙的编程思路和编程技巧也是提高代码效率很重要的一种方式。上面虽 然没有采用虚拟继承,但是它的扩展性依然没有受到一点点影响。例如我们想要实现一个自己的传输类 用于特殊的目的,那么只需要从虚拟传输类继承,如:class MyTransport : public TVirtualTransport<MyTransport> {...};然后实现自己的read(), readAll()等等函数(非虚 拟的)。

默认传输类和虚拟传输类都是为了实现整个传输层体系结构的帮助类,并没有实现具体的 什么传输功能,不过后面介绍的具体的大部分传输类都是基于这两个类之上(继承),那么我们就开始 看看一些重要的传输类的实现。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 模板
, 代码
, 传输
, 虚基类
, 类虚拟化
, 抽象虚拟类
, 一个
, 虚拟类
, 默认虚拟主机
, linux_scp传输
, 方式
, 虚拟函数
虚拟继承
thrift ttransport、thrift transport、thrift transport协议、virtual transport、ttransportexception,以便于您获取更多的相关知识。

时间: 2024-08-02 17:46:16

thrift的默认传输类TTransportDefaults和虚拟传输类TVirtualTransport的相关文章

如何在派生类中的隐藏基类的虚拟重载函数

我创建了一个类,基类中有虚拟重载函数.我想在派生类中改写基类中的虚拟重载函数.代码如下: #include <iostream.h>class B {private: int nNumber;public: virtual void test() { cout << "B::test()\n"; } virtual void test(int x) { nNumber = x; // 将传入的参数赋值给私有成员 cout << "B::te

在C# 项目中如何用ProjectInstaller类,安装虚拟网卡

问题描述 最近在做一个安装虚拟网卡的程序使用的语言是C#的Winform程序可是在网上查了很多资料大部分都是用C写的程序而且都是要先写一个驱动程序关于C我可以说是一窍不通后来在MSDN里找到了ProjectInstaller类,这个类是用于安装Windows服务程序的我想请问各位大侠可以用这个安装类实现安装虚拟网卡吗多谢各位大侠了比较急在线等~ 解决方案 解决方案二:没人回答先顶一个还有就是补充一下出了ProjectInstaller类,用别的类能安装虚拟网卡也好有知道的指点一下多谢了解决方案三

C++:派生类访问模板化基类(templatized base class)的命名

派生类继承模板化基类的成员函数, 默认是无法访问, 模板化基类的命名. 原因是模板的定制化有可能取消某些函数, 为了能在编译期检测出错误, 所以默认无法访问. 派生类访问模板化基类, 包含三种方法: 1. 调用基类函数时, 使用"this->", 指明调用的类, 是本类, 在编译时, 可以进行检查; 2. 使用using声明式, 可以把基类的函数引入派生类, 在编译时, 可以进行检查; 3. 使用显示修饰(explicit qualification), 不推荐, 显示修饰会屏蔽

如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。

问题描述 如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错. class Person { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName(){ return name; } pu

ios-自定义类系统自带的类模板没有了、怎么办啊!

问题描述 自定义类系统自带的类模板没有了.怎么办啊! 每次新建继承系统的类的文件都是光秃秃的!太不方便了,原来新建都会自带类模板的啊?求解 解决方案 类模板多种类型的类模板自定义类模板,类模板的默认类型数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器 解决方案二: 楼主指的是什么环境什么编辑器 解决方案三: 我觉得你是不是直接选了Objective-C文件,而不是cocoa touch class

java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗。

问题描述 java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗. 小弟刚从C++转JAVA不久,遇到这样一个问题,求高人帮忙解答. 我现在大体理解了注入的实现方式,例如在一个标注有@configuration 的类里面,如果一个方法 上面有@bean,那么这个方法的返回的类对象会被实例化. 我的疑问是这样的,这个实例化的对象是全局唯一的吗,或者说 是一个单体类吗? 因为我要在我的程序里不同地方使用调用这个bean的方法,我担心如果是单体类的话, 是否存在数据同步

java中List类是如何的List类的对象又是如何的

问题描述 java中List类是如何的List类的对象又是如何的 我知道List是列表类,List对象肯定就是显示一行数据的空间,类似view控件,那么list对象使用add方法填充数据的时候有什么要注意的地方吗 解决方案 你可以在list创建的时候就声明泛型. List<object> list = new ArrayList<object>; 这样在取出来的时候直接用那个对象类来接收,就不需要强转类型.. 当然.这样的话你存进去的时候也得是对应的类型,不然会报错 你也可以不声明

C 风格字符串,C++string类,MFC,CString类的区别。

字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中 字符串这一功能的实现是不相同的,C++完全兼容了C. 1.  标准C中的字符串    在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的.例如:      char   name[26]="This is a C-style string"; 或者      char  *name="This is a C-style string"

从string类的实现看C++类的四大函数(面试常见)_C 语言

朋友面试的一道面试题,分享给大家,面试官经常会问到的,实现string类的四大基本函数必掌握. 一个C++类一般至少有四大函数,即构造函数.拷贝构造函数.析构函数和赋值函数,一般系统都会默认.但是往往系统默认的并不是我们所期望的,为此我们就有必要自己创造他们.在创造之前必须了解他们的作用和意义,做到有的放矢才能写出有效的函数. #include <iostream> class CString { friend std::ostream & operator<<(std::