虚函数

C++总结(四)

主宰稳场 提交于 2020-02-15 02:23:48
一、多态 1.多态的概念 多态:同一个事物,在不同场景下表现出的不同的状态 2.多态的分类 静态多态(早绑定,静态联编): 在编译期间,根据所传递的实参类型或者实例化的类型,来确定到底应该调用那个函数即:在编译期间确定了函数的行为—函数重载、模板 动态多态(晚绑定,动态联编):在程序运行时,确定具体应该调用那个函数 3.动态多态的实现条件-- -在继承的体系中 虚函数&重写:基类中必须包含有虚函数(被virtual修饰的成员函数),派生类必须要对基类的虚函数进行重写 关于虚函数调用:必须通过基类的指针或引用调用虚函数 体现:在程序运行时,基类的指针或引用指向那个子类的对象,就会调用那个子类的虚函数 4.重写 1.基类中的函数一定是虚函数 2.派生类虚函数必须与基类虚函数的原型一致:返回值类型 函数名字(参数列表) 例外: a、协变–基类虚函数返回值基类的指针或引用 派生类虚函数返回派生类的指针或引用基类虚函数和派生类虚函数的返回值类型可以不同 b、析构函数:如果将基类中析构函数设置成虚函数,派生类的析构函数提供,两个析构函数就可以构成重写;两个析构函数名字不同 3.基类虚函数可以和派生类虚函数的访问权限不一-样 4、为了让编译器在编译期间帮助用户检测是否重写成功,C+ +11提供非常有用的关键字 1、override:专门]让编译帮助用户检测派生类是否成功重写了基类的虚函数

多态、虚函数

半世苍凉 提交于 2020-02-13 23:38:38
1.( 1)派生类和基类的成员函数同名的处理 #include<iostream> #include<string> using namespace std; class A { private: int a; public: A(int x) { a = x; } void setA(int x) { a = x; } void show() { cout << "基类A=" << a << endl; } }; class C :public A { //公有继承 A private: int c; public: C(int a, int b, int c1) :A(a) { c = c1; } //派生类构造函数 void setC(int x, int y) { c = x; } void showC() { cout << "c=" << c << endl; } /*void show() { cout << "派生类C=" << c << endl; }*/ void show() { A::show(); cout << "派生类C=" << c << endl; } }; void main() { A ta(12); C tc(1, 2, 3); ta.show(); tc.show(); } ▲main函数中的ta.show() 和tc.show(

关于C++的多态

别等时光非礼了梦想. 提交于 2020-02-12 15:38:02
多态英文叫做polymorphism,有两种多态,编译时多态,靠重载实现;运行时多态,靠虚函数实现。 所谓纯虚函数指的是一个虚函数没有给出实现,包含纯虚函数的类就叫做抽象类。 来源: CSDN 作者: 钱德勒马 链接: https://blog.csdn.net/u013516861/article/details/104277438

【C++】为什么含有纯虚函数的类无法定义对象

跟風遠走 提交于 2020-02-11 20:38:42
纯虚函数的地址为空,无法分配内存,纯虚成员函数对类是没有意义的,失去了普通类的数据和方法绑定于同一对象中的意义,因此无法构造对象,只能由其派生类继承这些成员函数并实现,才能构造派生类对象。 纯虚成员函数仅起到了定义接口的作用。 来源: https://www.cnblogs.com/skullboyer/p/12296361.html

C++学习笔记7

瘦欲@ 提交于 2020-02-11 15:56:10
目录 六、动态联编与虚函数 1、联编的概念 2、静态联编 3、动态联编 4、虚函数 5、虚析构函数 6、纯虚函数和抽象类 六、动态联编与虚函数 1、联编的概念 联编是指一个计算机程序自身彼此关联(使一个源程序经过编译、 连接, 成为一个可执行程序) 的过程, 在这个联编过程中, 需要确定程序中的操作调用(函数调用) 与执行该操作(函数) 的代码段之间的映射关系, 按照联编所进行的阶段不同, 可分为静态联编和动态联编。 2、静态联编 静态联编又称静态束定、 早期联编、 前期联编。 静态联编是指联编工作是在程序编译链接阶段进行的, 静态联编又称早期联编, 因为这种联编是在程序开始运行之前完成的。 在程序编译阶段进行的这种联编又称静态束定, 在编译时就解决了程序中的操作调用与执行该操作代码间的关系, 确定这种关系又被称为束定, 编译时束定又称为静态束定。 静态联编就是, 编译器在程序运行前就知道调用什么函数做什么事 。 静态联编特点: 速度快效率高 。 3、动态联编 动态联编又称动态关联、 动态束定、 后期联编、 晚期联编。 动态联编是指编译程序在编译阶段并不能确切地知道将要调用的函数, 只有在程序执行时才能确定将要调用的函数, 为此要确切地知道将要调用的函数,要求联编工作在程序运行时进行, 这种在程序运行时进行的联编工作被称为动态联编。 C++规定: 动态联编是在 虚函数

virtual虚函数

允我心安 提交于 2020-02-11 11:39:15
  virtual是定义C++中 虚函数 的关键字,这种 函数 或 方法 可以被子类 继承 和 覆盖 ,通常使用 动态调度 实现。这一概念是 面向对象程序设计 中(运行时) 多态 的重要组成部分 。简言之,虚函数可以给出目标函数的定义,但该目标的具体指向在编译期可能无法确定。 在 面向对象程序设计 中,派生类继承自基类。使用 指针 或 引用 访问派生类对象时,指针或引用本身所指向的类型可以是基类而不是派生类。如果派生类覆盖了基类中的方法,通过上述指针或引用调用该方法时,可以有两种结果: 调用到基类的方法:编译器根据指针或引用的类型决定,称作“早绑定”; 调用到派生类的方法:语言的运行时系统 根据对象的实际类型决定 ,称作“ 迟绑定 ”。 虚函数的效果属于后者。如果问题中基类的函数是“虚”的,则调用到的都是最终派生类(英语:most-derived class)中的函数实现,与指针或引用的类型无关。反之,如果函数非“虚”,调用到的函数就在编译期根据指针或者引用所指向的类型决定。 来源: https://www.cnblogs.com/qq2806933146xiaobai/p/12294208.html

堆栈里的秘密行动:劫持执行流

拈花ヽ惹草 提交于 2020-02-11 10:50:07
前情回顾 : 线程老哥执行memcpy越界访问溢出,堆栈里的一众对象难逃噩运。 详情参见: 堆栈里的悄悄话——智能指针 神秘的0xCC “去吧,为了首领的伟大理想出发” 我是一段二进制代码shellcode,0xCC大人精心创造了我,一同诞生的还有一个HTML表单文件小P,我就栖身在小P的身上,随着一个POST请求,我们朝着目标奔去。 很快我们就抵达目的地,这是一个Linux帝国,无数的数据包在这里来来往往。 “这里可真热闹” “嘘,先别说话,马上要经过防火墙,藏好了,可别被发现了”,小P一把捂住了我的嘴。 说完我们就来到了防火墙面前,当差的守卫查看了我们的源IP和端口,又看了目的IP和目的端口,接着瞟了一眼负载数据,当他望向我这边时,我紧张的大气都不敢出一声,把头深深的埋着。 守卫凶神恶煞的问到:“你是去80端口的?这里面装的是什么?” “回大人的话,这里面是个HTML表单,这单业务比较急,还望大爷行个方便”,小P一边说一边悄悄给守卫的衣袖里塞了一些银两。 “走吧,放行!”,总算等来了守卫的这句话。 通过了安检,我俩被安排到了一个队列等待,一会儿,一个自称是Apache公司的线程大哥把我们取走了。 栈溢出 & Stack Cannary 线程大哥把我俩放到了一片陌生的区域。 “你等我一下,我去打听下情况”,小P叮嘱完我后,和隔壁一个对象聊了起来。 “我打听清楚了,这里是进程的堆区

c++ 面试整理

别说谁变了你拦得住时间么 提交于 2020-02-11 02:58:10
1. 继承方式 public   父类的访问级别不变 protected 父类的public成员在派生类编程protected,其余的不变 private 父类的所有成员变成private #include <iostream> using namespace std; class base { public: void printa() { cout <<"base"<< endl; } protected: void printhello() { cout <<"helo"<< endl; } private: void printnohello() { cout <<"no hello"<< endl; } }; class derived : public base { public: void printb() { printhello(); } // void printc() { printnohello(); } //printnohello是父类的私有函数,不可访问 }; int main() { base a; a.printa(); //a.printhello(); //printhello是类derived的protected函数,不可访问。 } 2. sizeof 和 strlen 的区别 sizeof 是一个操作符,strlen 是库函数。

Interview_C++_day3

眉间皱痕 提交于 2020-02-09 19:40:21
虚函数表 在有虚函数的类中,存在一个虚函数指针,该指针指向一张虚函数表,当子类继承基类的时候,也会继承其虚函数表。当子类重写基类中的虚函数时,会将虚函数表中的地址替换成重写的函数地址。 (图片来自 https://www.cnblogs.com/bewolf/p/9352116.html ) char* 和 char[] 的区别 char *s1 = "abc"; char s2[] = "abc" 以上两种定义方式直接输出结果,则都能正常输出。但修改 \(s1\) 的内容会引起程序崩溃,而修改 \(s2\) 的内容不会。 因为 \(abc\) 是保存在常量区内,而第一种方式是利用指针直接指向常量区,第二种方式是通过数组将 \(abc\) 复制出来,存储在栈区内,所以修改 \(s2\) 的值不会崩溃而修改 \(s1\) 的值会。 C++ 程序内存结构 C++ 程序的内存分区自低地址至高地址分别分为 代码区、常量区、静态(全局)存储区区、堆区、栈区 。 代码区存放程序代码,是只读的。 常量区存放常量,这里的量不可被改变。 静态变量和全局变量存放在静态存储区内,一直到程序全部结束后才会释放内存。 堆区内存由程序员利用 \(malloc、free、new、delete\) 分配,若申请了空间但忘记释放,容易造成内存泄漏。 栈区存放函数内的局部变量,形参,和函数返回值。当数据过了作用范围后

面向过程和面向对象及面向对象的三大特征

痴心易碎 提交于 2020-02-09 07:39:17
新手继续,大牛可以关闭浏览页了。 英文及缩写 :   面向过程:procedure oriented programming POP   面向对象:object oriented programming OOP 面向对象和面向过程的 历程 :   面向过程编程采取的是时间换空间的策略,因为在早期计算机配置低 ,内存小,如何节省内存则成了首要任务,哪怕是运行的时间更长。随着硬件技术的发展,硬件不再成为瓶颈,相反更好的模拟现实世界、系统的可维护性等问题凸显出来,于是面向对象设计应运而生。当下:应用在 PC 机上的一般应用系统,由于不太需要考虑硬件的限制,而系统的可维护性等方面却要求很高,一般采用面向对象方式;而在内存限制有所要求的嵌入式系统,则大多采用面向过程方式进行设计编程。 定义 :   面向过程是分析解决问题的步骤,然后用函数把这些步骤一步一步的实现,然后在使用的时候一一调用则可。面向对象是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。下面举一例说明面向过程和面向对象编程。 首先使用面向过程: 1、开始游戏, 2、黑子先走, 3、绘制画面, 4、判断输赢, 5、轮到白子, 6、绘制画面, 7、判断输赢, 8、返回步骤2, 9、输出最后结果。 把上面每个步骤用分别的函数来实现,问题就解决了。