多态是 C++中的重要内容,也是设计模式的基础。
形成多态的几个基本条件为:
- 继承和虚函数
- 父类对象指向子类对象
多态形成的原理就是 vptr 指针和 vtable 虚函数表,当一个类中有虚函数时,编译器就会自动生成虚函数表,并生成一个 vptr 指针指向这个虚函数表。调用虚函数的时候,会通过这个 vptr 指针找到相应的虚函数表,然后再定位到对应的函数,以此来调用形成多态。
多态是 C++中的重要内容,也是设计模式的基础。
形成多态的几个基本条件为:
多态形成的原理就是 vptr 指针和 vtable 虚函数表,当一个类中有虚函数时,编译器就会自动生成虚函数表,并生成一个 vptr 指针指向这个虚函数表。调用虚函数的时候,会通过这个 vptr 指针找到相应的虚函数表,然后再定位到对应的函数,以此来调用形成多态。
netstat 是控制台命令, 是一个监控 TCP/IP 网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。 Netstat 用于显示与 IP 、 TCP 、 UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
一、问题描述 安装 linux 双系统后,只要进入 linux 系统,windows 的系统时间就会错误。 二、解决方案
|
1 2 3 4 |
sudo apt-get install ntpdate sudo ntpdate ntp.sjtu.edu.cn //将时间更新到硬件上面 sudo hwclock --localtime --systohc |
大四上学期的时候因为毕业设计接触到了 IC 卡破解,当时是花了一个星期的时间破解了学校了水卡、洗衣卡等,毕业后没有再玩过了。
前几天搬家没有门禁卡,每次都是在楼下苦等没有办法。不得已之下又又拿出工具试了试,才发现一年没用,差不多又忘完了。于是记录下流程,以备后用!
select 模型是 socket 中的一种多路 IO 复用模型之一,通过轮询的方式来完成多路访问控制。
一个很简单的例子来描述 select 模型:
幼儿园老师要照顾所有的小朋友,每天他都会轮流去问小朋友:「小朋友小朋友,你饿了吗?」
如果小朋友饿了,那么老师就给这个小朋友喂饭,否则就开始询问下一个朋友,一直循环下去直到放学。
同时,如果班级里有其他的同学来了,也把他加到询问队列。如果有哪个同学生病了,则把它踢出询问队列。
select 模型的原理就是这样,把所有连接的客户端 socket 加入到一个集合中去,然后一直不断轮询,判断哪一个 socket 有数据到达,就读取数据。否则继续轮询下一个数据。
linux 系统在编译的时候就固定了 select 模型文件描述符集合的大小为 1024 个,这个大小无法更改,因此,select 模型只适用于并发量小于 1024 个的服务连接。
|
1 2 |
> grep "FD_SETSIZE" /usr/include/ -R /usr/include/linux/posix_types.h:#define __FD_SETSIZE 1024 |
TCP 协议的三次握手和四次挥手分别表示了 TCP 连接的建立和释放过程,在整个 TCP 协议是一个很重要的内容,同时也是面试时的常见考点。
趁着找工作的劲,使用
socket+tcpdump分析了一下工作流程,socket 客户端代可以在 socket 介绍及函数原语找到。服务端的代码可以在 socket 的 select 模型找到。
socket 中各函数对应的 TCP 状态演示图:

参考:[linux 速成案例](/linux/linux-maintenance/quick-guide-of-tcpdump-html.html)
最简单的用法就是直接输入 tcpdump,监控所有的数据包:
|
1 2 3 4 5 6 7 8 9 |
[ma@ma ~]$ tcpdump tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on usbmon1, link-type USB_LINUX_MMAPPED (USB with padded Linux header), capture size 65535 bytes 10:53:08.002434 CONTROL SUBMIT to 1:2:0 10:53:08.004461 CONTROL COMPLETE from 1:2:0 10:53:08.004502 CONTROL SUBMIT to 1:1:0 10:53:08.004502 CONTROL COMPLETE from 1:1:0 10:53:10.850080 CONTROL SUBMIT to 1:1:0 10:53:10.850102 CONTROL COMPLETE from 1:1:0 |
面向对象的三大基本特征:封装、继承和多态。类对象通过 public/private/protected 关键字实现对象的封装,封装后通过继承实现多样性,而这个多样性又需要通过多态来完成。
假设要实现一个攻击的功能,不同的角色战斗力的都不同,在以往的 c 中,要完成这个功能需要对每个不同的角色都添加一个攻击函数:
|
1 2 3 |
void attack_normal(obj n) { cout << "我砍了你一刀,你流了一滴血!" << endl;} void attack_vip(obj v) { cout << "我是 VIP,我的刀是屠龙宝刀,你流了十滴血!" << endl;} void attack_rmb(obj r) { cout << "我是 RMB 玩家,你已经死了!" << endl; } |
而在有多多态后,所有的函数都可以合并为一个:
|
1 2 3 |
void attack(obj *o) { // 根据对象 o 的实际类型,攻击敌方。 } |
定义以下类:
|
1 2 3 4 5 6 7 8 9 10 |
class A{ public: A(): A(0) { } A(int i){ cout << "A(" << i << ")" << endl; }; A(int i, int j){ cout << "A("<< i << ", " << j << ")" << endl; } }; |