54,C++(08)

/*
达内学习 C++ day52 2013-11-14
*/
回忆:
继承
1,继承的目的
  a,代码复用  传承父类所有的数据(属性和函数)
  b,扩展  一个子类具备父类所有的功能和特性
      把一个子类对象 当做父类对象来看
2,组合 和 继承的关系
3,继承的语法
   class B:继承方式 A{};
4,继承的方式
  公开  保护   私有
5,如果是私有继承 如何对父类的数据进行访问
  public 接口  或者  友元
6,不能被子类继承的
 构造函数  析构函数  拷贝构造 赋值运算符
7,子类对父类构造函数  和 析构函数的调用
  子类会默认调用父类的无参构造 和 析构函数
  也可以指定调用父类的构造函数(初始化参数列表)
8,子类如何调用父类的拷贝构造函数和赋值运算符
   子类会默认调用父类的拷贝构造函数 和 赋值运算符
  一旦自定义了拷贝构造 和 赋值运算符 则必须显示的调用父类拷贝构造和赋值运算符。
9,名字隐藏
  当子类继承了父类的数据,如果子类中定义了和父类重名的数据,则子类的数据会覆盖掉父类的。
  如何使用父类的数据   父类名::
10,多重继承的语法
 class C:public A,public B{};
11,多重继承引入的问题的解决
  a,命名冲突的解决
 使用父类名::
    名字隐藏机制 
  b,子类重复继承父类的同名数据
   可以采用虚继承-----解决菱形继承(多个类有共同父类和共同子类)
// -----------------------------------
多态
  1,多态的概念 和 分析
   一个父类对象的指针或者引用 执行或者引用子类对象时,调用父类型中定义的虚函数时,函数的表现会是相应的子类的实现。
   继承是构成多态的基础,父类的指针和引用指向子类对象是前置条件,虚函数是构成多态的关键。
  2,多态举例
  3,虚函数在子类中覆盖父类的实现时,必须遵守函数重写的规则(overwrite)
    函数名,参数列表,返回值都必须相同 访问权限没有限制
  4,多态的应用
  为了写出通用性代码
  函数的参数  函数的返回值
  5,多态的本质
  虚函数表
  对象的首地址 指向一个 存有虚拟函数地址的 虚拟函数表
  6,运行时识别
    a. typeid(类型)
       typeid(对象)
      typeinfo
      name  取得类型名字
         ==  判断两个typeinfo 是否相等 判断类型是否一致
         !=  判断两个typeinfo 是否不等
     #include<typeinf>
    b,dynamic_cast<类型>(对象)
       static_cast<类型>(对象)
      静态类型转换  转换之后无法判断是否转换成功,动态类型转换 可以判断是否类型转换成功,指针为空,代表转换失败。指针不为空 代表转换成功。
 7,抽象类
  具备纯虚函数的类叫抽象类
  virtual void foo()=0;
   抽象类不能实例化
   抽象类除了不能实例化之外 和一个普通的类没有任何失败。
   如果一个类中除了构造函数 析构函数 外所有的函数都是纯虚函数 这种类叫纯抽象类。
 如果子类继承了抽象类,不去实现纯虚函数则子类成为抽象类。
 8,如果一个父类指针指向一个子类对象 则 delete 父类对象指针 会调用父类对象的析构函数 ,子类析构的行为是不确定的
   父类对象的指针 = new 子类型();
   把父类的析构函数作成虚析构函数
  当父类中有虚函数时,则把析构函数作成虚函数

//=============================================================
C++ 中的IO
命令行进行输入输出
cin(istream) cout(ostream)
#include<iostream>

文件的输入输出
ifstream  文件读
ofstream  文件写
iofstream  既能读也能写
#include<fstream>

字符串的操作
istringstream
ostringstream
#include<sstream>

格式化IO  和 非格式化 IO
格式化:考虑类型   非格式化:字节处理,不考虑类型
get()得到一个字符  put()输出一个字符

### 回答1: 要在 C++ 中还原 Protobuf 结构,你需要按照以下步骤进行操作: 1. 定义 Protobuf 的消息结构:在 .proto 文件中定义 Protobuf 的消息结构,并使用 Protocol Buffer 编译器生成 C++ 代码文件。 2. 包含头文件:在 C++ 代码中包含生成的头文件。 3. 创建消息对象:使用生成的类创建一个消息对象。 4. 设置消息内容:使用消息对象的 setter 方法设置消息的内容。 5. 序列化:将消息对象序列化为字节流。 6. 反序列化:将字节流反序列化为消息对象。 以下是一个简单的示例代码: ```c++ #include <iostream> #include "person.pb.h" // 包含生成的头文件 int main() { // 创建一个 Person 对象 Person person; person.set_name("Alice"); person.set_id(123); person.set_email("alice@example.com"); // 序列化 std::string data; person.SerializeToString(&data); // 反序列化 Person person2; person2.ParseFromString(data); // 输出反序列化后的消息内容 std::cout << "Name: " << person2.name() << std::endl; std::cout << "ID: " << person2.id() << std::endl; std::cout << "Email: " << person2.email() << std::endl; return 0; } ``` 在上述代码中,我们使用了名为 `Person` 的消息结构,并使用 Protocol Buffer 编译器生成了 C++ 代码文件 `person.pb.h`。在 `main` 函数中,我们创建了一个 `Person` 对象并设置了它的内容,然后将它序列化为字节流。接着,我们将字节流反序列化为另一个 `Person` 对象,并输出它的内容。 ### 回答2: 谢谢你的问题。Protobuf 是一种二进制数据序列化格式,用于在不同的系统之间传输和存储结构化数据。如果要还原 Protobuf 结构,你需要了解数据的类型和字段定义。以下是一个示例: 假设我们有一个 Protobuf 定义的消息结构,包含一个名称和年龄字段: ```protobuf message Person { string name = 1; int32 age = 2; } ``` 在这个示例中,`Person` 是一个消息类型,拥有两个字段:`name` 和 `age`。`name` 字段的类型是字符串,字段标识号是 1;`age` 字段的类型是整数,字段标识号是 2。 如果我们从一个二进制数据中还原 Protobuf 结构,我们可以按照如下步骤进行: 1. 解析二进制数据,将其转换为可读的消息结构; 2. 查找字段的标识号,找到对应的字段类型; 3. 根据字段类型解析字段的值; 4. 重复以上步骤,直到解析完整个消息结构。 对于上述示例,如果我们有一个二进制数据 `080512546f6d0810`,我们可以进行如下还原: 1. 将二进制数据转换为十六进制:`08 05 12 54 6f 6d 08 10`; 2. 将十六进制解析为字段标识号和字段类型:`08` 表示字段标识号 1,类型为字符串;`05` 表示字段长度为 5; 3. 将剩余的十六进制解析为字段标识号和字段类型:`12` 表示字段标识号 2,类型为变长整数;`54 6f 6d` 表示字段值为字符串 "Tom"; 4. 完成解析,得到还原后的结构:`name: "Tom", age: 16`。 这只是一个简单的示例,实际情况可能更加复杂,特别是对于包含嵌套结构或者重复字段的消息。还原 Protobuf 结构需要对消息定义有深入的了解,并按照消息定义的规则进行解析。 ### 回答3: protobuf是一种用于序列化结构化数据的语言无关、平台无关、可扩展的协议。结构体是一种将多个不同类型的变量组合成一个单独的数据单元的方式。还原protobuf结构指的是根据protobuf的定义,将序列化后的数据转换为原始的结构体。 要还原protobuf结构,首先需要了解protobuf的定义文件,也就是.proto文件。这个文件使用一种简单的语法定义了消息类型以及消息中的字段。每个字段都有一个唯一的标识符和类型。 接下来,我们需要使用protobuf的编译器将.proto文件编译成对应的源代码。编译器提供了各种编程语言的支持,例如Java、C++等。编译生成的源代码包含了定义的消息类型和字段的具体实现。 在得到编译生成的源代码后,我们可以使用相应的编程语言来操作protobuf数据。首先,我们需要将序列化后的数据转换成字节流。然后,使用protobuf提供的库函数,将字节流解析成对应的消息对象。解析后,就可以通过访问消息对象的字段来获取原始数据。 需要注意的是,还原protobuf结构的前提是要有对应的.proto文件以及生成的源代码。没有这些信息,是无法还原protobuf结构的。因此,在进行protobuf消息的序列化和反序列化时,一定要确保.proto文件与生成的源代码的一致性。 总结起来,还原protobuf结构可以通过以下步骤实现:了解.protobuf文件的定义 -> 使用protobuf编译器生成源代码 -> 将序列化后的数据转换成字节流 -> 使用protobuf库函数解析字节流 -> 访问消息对象的字段获取原始数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值