虚函数

面经总结-仅供参考

别等时光非礼了梦想. 提交于 2019-12-20 21:04:52
面经总结-仅供参考 1 服务器如何判断客户端连接不上了 2 心跳包多长时间发一次,如何判断客户端下线了 3 四次挥手 通过什么接口来判断????? 4 epoll只能练500-1000个连接,有没有判断是什么原因引起的 5 noSQL-redis 6 消息队列-应用场景 7 [微服务容器](https://www.cnblogs.com/jsjwk/p/11169296.html) 8 虚函数析构函数和普通虚函数区别,及原因,析构顺序 10 [Redis为什么是单线程的](https://blog.csdn.net/wanderlustlee/article/details/81148840) 11 不同机器进程间如何通信: 12 服务器如何转发消息的 14 西安发消息到上海,接收方消息延迟了,原因 15客户端发了很多消息,服务器怎么及时处理? 16客户端收到大量数据会导致客户端卡顿,怎么优化? 17. 十几个日志文件,用什么shell命令可以筛选出自己想要的日志内容 18. 客户端连接不上服务器的问题一般怎么定位?(未解决) 19. [多进程文件怎么共享,为什么要用mmap。](https://blog.csdn.net/tencupofkaiwater/article/details/88897529) 20. [vi打开文件后,怎么替换无数个想要替换的内容](https:/

【逆向知识】动态调试技巧-C++代码逆向

为君一笑 提交于 2019-12-20 09:08:08
1、C++类代码的特点 寄存器ECX传参时一般用作this指针(对象地址)或是计数器。 有ecx传参的call,是成员函数,构造函数,析构函数 能访问成员变量的函数都会有ecx传参 静态函数、全局函数无ecx(this指针) 返回值 寄存器eax一般用作返回值 识别构造函数的OD反汇编代码 特点: (1) 代码特点:没有返回值、用于初始化 (2)反汇编特点:有返回值,而且是this指针 根据反汇编可以看出成员变量的顺序,因为在内存数据中的排布顺序是由代码中成员变量定义顺序决定的。 识别构造函数的办法: (1)构造函数调用时,会使用ECX用于this指针 (2)构造函数在反汇编层有返回值,是eax存放this指针 (3)构造函数用于初始化,一般内存如果是未初始化的比如CCCCCCC,经过构造函数会完成初始化。 (4)如果一个函数有对前4字节初始化为一个指针地址,那么可能是在初始化虚函数表指针。 如果一个类有虚函数,那么对象的内存数据里会有虚函数指针的定义。构造函数会初始化虚函数表指针,而类中定义多少个虚函数也只有一个虚函数表指针。 识别成员函数的OD反汇编代码 特点: (1)ECX传递this指针,调用成员函数 (2)成员函数中会访问exc所指向的内存空间 成员函数与虚函数本身没有什么区别,所以反汇编出来的代码都差不多。 识别成员函数: (1)如果找到了构造函数

虚函数实现原理

▼魔方 西西 提交于 2019-12-20 02:05:11
转自:https://blog.csdn.net/weixin_40237626/article/details/82313339 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家一个清晰的剖析。 当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。 言归正传,让我们一起进入虚函数的世界。 虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样

C++中的多态

╄→尐↘猪︶ㄣ 提交于 2019-12-19 10:36:38
C++中多态 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在C++中通过虚函数实现的。 形式 C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。多态就是允许方法重名参数或返回值可以是父类型传入或返回。C++中,实现多态有以下方法: 虚函数; 抽象类; 覆盖; 模板(重载和多态无关)。 作用 1.把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。 2.赋值之后,父类型的引用就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。 class A { public : A ( ) { } virtual void foo ( ) { cout << "This is A." << endl ; } } ; class B : public A

虚函数

非 Y 不嫁゛ 提交于 2019-12-16 09:19:30
C++中并没有方法的概念。方法(method)实际上是java的概念。在C++中,方法被称为函数。 所以虚方法的准确说法是虚函数。在C++中,是一种特别的类成员函数。 在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体}; 实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。 也就是说被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。 示例代码: #include using namespace std; class Pet{ public: virtual void play() //定义函数为虚函数 { cout<<“它正在玩!”<<endl; } }; class Dog : public Pet //继承Pet类 { public: void play(); }; void Dog::play() { Pet::play(); cout<<“它正在追猫!”<<endl; } int main() { Pet *dog = new Dog; dog->play(); 在这里

C++ 详解dynamic_cast

瘦欲@ 提交于 2019-12-15 00:17:38
dynamic_cast运算符的主要用途:将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用调用非虚函数。如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数。 前提条件:当我们将dynamic_cast用于某种类型的指针或引用时,只有该类型含有虚函数时,才能进行这种转换。否则,编译器会报错。 dynamic_cast运算符的调用形式如下所示: dynamic_cast<type*>(e) //e是指针 dynamic_cast<type&>(e) //e是左值 dynamic_cast<type&&>(e)//e是右值 e能成功转换为type*类型的情况有三种: 1)e的类型是目标type的公有派生类:派生类向基类转换一定会成功。 2)e的类型是目标type的基类,当e是指针指向派生类对象,或者基类引用引用派生类对象时,类型转换才会成功,当e指向基类对象,试图转换为派生类对象时,转换失败。 3)e的类型就是type的类型时,一定会转换成功。 定义如下基类和派生类: #include<string> #include<iostream> usingnamespacestd; classBase{ public: Base():str(nullptr) {} Base(strings):str(s) {} virtualvoidprint()

c++类内存分布

两盒软妹~` 提交于 2019-12-14 19:07:17
我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。 工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C+±>命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。 class Base { int a ; int b ; public : void CommonFunction ( ) ; } ; 然后编译一下,可以看到输出框里面有这样的排布: 这里不想花精力在内存对齐因素上,所以成员变量都设为int型。 从这里可以看到普通类的排布方式,成员变量依据声明的顺序进行排列(类内偏移为0开始),成员函数不占内存空间。 再看下继承,往后面添加如下代码 class DerivedClass : public Base { int c ; public : void DerivedCommonFunction ( ) ; } ; 编译,然后看到如下的内存分布(父类的内存分布不变,这里只讨论子类成员变量的内存分布): 可以看到子类继承了父类的成员变量,在内存排布上,先是排布了父类的成员变量

[C++系列] 68.多态基础及虚函数、抽象类详解

别说谁变了你拦得住时间么 提交于 2019-12-13 08:59:16
文章目录 1. 多态的概念 1.1 概念 2. 多态的定义及实现 2.1 多态定义的构成条件 2.2 重载、覆盖(重写)、隐藏(重定义)的对比 3. C++11 override 和 final 4. 抽象类 4.2 接口继承和实现继承 1. 多态的概念 1.1 概念 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优 先买票。 再举个栗子: 最近为了 争夺在线支付市场 ,支付宝年底经常会做诱人的扫 红包-支付-给奖励金 的活动。那么大家想想为什么有人扫的红包又大又新鲜8块、10块…,而有人扫的红包都是1毛,5毛…。其实这背后也是一个多态行为。支付宝首先会分析你的账户数据,比如你是新用户、比如你没有经常支付宝支付等等,那么你需要被鼓励使用支付宝,那么就你扫码金额 = random()%99;比如你经常使用支付宝支付或者支付宝账户中常年没钱,那么就不需要太鼓励你去使用支付宝,那么就你扫码金额 = random()%1;总结一下: 同样是扫码动作,不同的用户扫得到的不一样的红包,这也是一种多态行为 。ps:支付宝红包问题纯属瞎编,大家仅供娱乐。 2. 多态的定义及实现 2.1 多态定义的构成条件 多态是在不同继承关系的类对象,去调用同一函数

c++纯虚函数

狂风中的少年 提交于 2019-12-13 08:19:09
打造c++抽象类 与其他语言的抽象类相似,抽象类不能实例化,也不能作为函数的参数,只可以作为指针类型或者引用类型 抽象类的基本特征 #pragma once #include<iostream> using namespace std; class jetplane { private: protected: public: virtual void loadweapon(string type,int num)=0;//最显著特征,成员函数声明为virtual,并且等于0 virtual void warfare()=0; }; 当然抽象类不能实例化 #include<iostream> #include"jetplane.h" void main() { jetplane tornado(); } 报错: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2259 “jetplane”: 不能实例化抽象类 myabstractcls c:\users\administrator\source\repos\myabstractcls\myabstractcls\mymain.cpp 5 2.解决多重继承的二义性问题 目前,要求多重继承的类有共同的基类,否则多重继承的二义性仍旧无法解决 实例化的类可以作为抽象类的接口使用 jetplane *p =&mig31 p-