若子类继承基类,两者析构函数不加virtual关键字,此时调用函数 参数为基类指针指向子类对象 删除对象,那么只会执行基类构造函数,此时对于编译器而言,你传进去的基类指针,在函数体已经静态编译好为基类的构造函数。
如果在基类的析构函数前加上virtual关键字,此时对于子类的析构函数,也会自动加上virtual关键字,从而加入到虚函数表中,再调用上面的函数,会首先寻找调用子类的析构函数,此时在子类的析构函数最后面,编译器会自动执行基类的析构函数
1.基类(父类)里面的方法是用virtual关键字修饰,变成虚函数
2.子类继承父类重写父类里面的方法
3.用父类的指针或引用指向子类对象
4.通过父类指针或引用调用子类重写的父类方法
静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,没有的话就会发出警告或者报错;
静态多态:函数重载,泛型编程
动态多态是在程序运行时 根据基类的引用指向的对象来确定自己具体该调用哪一个类的虚函数。
动态多态:虚函数
作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。多态是设计模式的基础,多态是框架的基础。
tcp是可靠的,面向字节流的协议,传输过程中可能就会
1 |
|
中特别要注意rbytes = recv(cfd,buffer + total_received,length - total_received,0);
这段代码的意思就是,从cfd中读取数据到buffer+已经接收的数据地址段,为什么要length+total_received,因为一段数据可能会被拆分发送,也就是说,如果只填length的话,第一次的recv可能只会接收前半段的拆分数据,那么后面的数据就接受不到。如果像上面正确设置,即使第一次没有接受完,因为total_received的值和length不等,就会在下个循环继续接收,接受的字节数就等于length-已经接受的字节数。
真的不喜欢数据结构啊啊 链表什么的真讨厌啊啊啊啊 made真的恶心,各种结构体,遍历真的无趣T_T
还是先学着后面的吧,udp的局域网聊天先放一放,本来想着能实现也是很不错的,但是代码也不完整,等以后回头了,把这块和学生管理系统那块再统一看看T_T