虚函数

转 C++面试题

我怕爱的太早我们不能终老 提交于 2019-11-28 05:18:51
1.static有什么用途?(请至少说明两种) 1)函数体内,声明为static的变量,在函数调用中其值不变。 2) 在同一个文件内(但在函数体外),声明为静态的变量,可被本文件内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用( &)与指针(*)有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 4) 引用没有 const,指针有 const,const 的指针不可变; 附:int &ra=a; //引用ra,是变量a的引用,即别名 & 在此不是求地址运算,而是起标识作用。 声明引用,必须同时对其初始化。 引用声明完,相当于变量有两个名称。 引用本身不占有存储单元 不能建立引用的引用,指向指针的引用(int && n ; int &*p 为错误的 int *&q;正确) 3.描述实时系统的基本特性 时间约束性 可预测性 可靠性 4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库 局部变量在堆栈。 局部变量会屏蔽全局变量 全局变量运行时会更快(不用再分配空间) 5.什么是平衡二叉树?

虚析构函数

落花浮王杯 提交于 2019-11-28 03:19:17
  继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数,这样我们就能动态分配继承体系中的对象了。   如前所述,当我们delete一个动态分配的对象的指针时将执行析构函数。如果该指针指向继承体系中的某个类型,则由可能出现指针的静态类型与被删除的动态类型不符的情况。例如,如果我们delete一个Quote*类型的指针,则该指针有可能实际指向了一个Bulk_quote类型的对象。如果这样的话,编译器就必须清楚它应该执行的是Bulk_quote的析构函数。 和其它函数一样,我们通过在基类中将析构函数定义成虚函数以确保执行正确的析构函数版本 : class Quote { //如果我们删除的是一个指向派生类对象的基类指针,则需要虚析构函数 virtual ~Quote() = default; //动态绑定析构函数 }; 和其它虚函数一样,析构函数的虚属性也会被继承。因此,无论Quote的派生类使用合成的析构函数还是定义自己的析构函数,都将是虚析构函数。只要基类的析构函数是虚函数,就能确保当我们delete基类指针时将运行正确的析构函数版本: 来源: https://www.cnblogs.com/bootblack/p/11388573.html

美团后台面经

末鹿安然 提交于 2019-11-28 03:12:51
日期:2019.08.21 1、14道选择题,一道编程题(十进制转十六进制)30分钟左右做完 3、介绍一下做过的项目,功能、技术、负责哪些部分? 2、struct和class的区别 3、C++模板关键字 4、纯虚函数作用,纯虚函数可不可以有实现体? 5、linux I/O 模型,几种方式(从select答到epoll) 6、STL常用的容器及用法 7、如果元素是复杂的结构体,map插入时怎么处理? 8、动态库和静态库,动态库有几种调用方式? 9、linux大小端模式(说了高位地址、低位地址) 10、有什么问题问我? 感觉C++底层的知识答得不太好,也确实是自己理解得不够深入,继续加油吧! 来源: https://www.cnblogs.com/myblog1993/p/11388243.html

多态

我的未来我决定 提交于 2019-11-28 01:43:20
多态主要用于父类虚函数传递给子类 子类利用虚函数对父类的重写 这样父类就可以通过指针对子类的虚函数进行调用 父类不可以通过指针直接调用子类中的方法,需要子类利用虚函数调用子类中的成员变量或者函数才能对调用 这里引入了静态联编和动态联编 静态联编:在运行前 就知道运行什么函数 调用熟读比较快 但是不灵活c语言中经常运用 动态联编:利用指针找到虚函数 调用的时候才知道用那个函数 比较灵活 但是调用速度比较慢 拥有虚函数的对象中会有一个虚指针 这个指针指向虚函数表(存放虚函数的地址) 子类重写父类虚函数 区修改表中的地址 虚基类 为了重写虚函数 父类总虚函数可以不实现 纯虚函数就是在父类的虚函数中写=0 不写函数体 不能调用 virtual fun()=0; 拥有纯虚函数的类 虚基类/抽象类 没法定义对象 但是可以定义指针或者引用 可以派生新的类 子类纯虚数即可定义对象 在类中书写完整的数据+功能 参数只有一个传递对象的地址 不同对象传递不同的地址 传入内容 对象中的数据 若干成员个数 具体功能实现如下代码 多态.cpp 1 #include<iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 void fun(){ 7 cout << "父类的fun函数" << endl; 8 } 9 virtual void fun2

继承与虚函数

馋奶兔 提交于 2019-11-27 22:19:43
  使用继承可以定义相似的类型并对其相似关系建模。 1 class Quote { 2 public: 3 std::string isbn() const; 4 virtual double net_price(std::size_t n) const; 5 }; 6 7 class Bulk : public Quote { 8 public: 9 double net_price(std::size_t n) const override; 10 }; View Code    虚函数: 通过virtual生命基类中希望派生类定义适合自身的版本,则用virtual来声明基类的函数,在派生类中对应函数的形参列表后面添加override关键字。   动态绑定:使用同一段代码,对具有一定区别的相似类型以统一的方式进行处理。 double print_total(ostream& os, const Quote& item, size_t n) { double ret = item.net_price(n); os << "ISBN: " << item.isbn() << " # sold: " << n << "total due: " << ret << endl; return ret; } View Code   调用方法: 1 print_total(cout,

定义基类和派生类

自闭症网瘾萝莉.ら 提交于 2019-11-27 21:53:29
成员函数与继承   在C++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望派生类进行覆盖的函数;另一类是基类希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义成虚函数(virtual)。当我们使用指针或引用调用虚函数时,该调用将被动态绑定。根据引用或指针所绑定的对象类型不同,该调用可能执行基类版本,也可能执行某个派生类版本。   基类通过在其成员函数的声明语句之前加上关键字virtual使得该函数执行动态绑定。 任何构造函数之外的非静态函数都可以是虚函数。 关键字virtual只能出现在类内部的声明语句而不能用于类外部的函数定义。 如果基类把一个函数声明成虚函数,则该函数在派生类中隐式也是虚函数。   成员函数如果没有被声明为虚函数,则其解析过程发生在编译时而非运行时。 访问控制与继承 来源: https://www.cnblogs.com/bootblack/p/11379293.html

重读深度探索C++对象模型:虚函数

走远了吗. 提交于 2019-11-27 21:46:31
1.单一继承下的虚函数(待更新) 2.多重继承下的虚函数 多重继承讲给虚函数带来很大的问题,主要有三点: 1.虚析构函数:    析构函数一般都是虚函数,不然删除某个指向派生类的基类指针将不会析构派生类的内容。 首先关于多重继承: 如以下这个关系: A与B同级,C分别继承这两个类。 如果A* a=new C; B* b=new C; 则通过a只能调用displayA(); 通过b只能调用displayB(); 也就是说b->displayA()这样是非法的。 然后是关于多重继承对虚析构函数的影响。 现在A是基类中最左边的类,如果我们 A* a=new C; 现在a指向的实际上是现在这个对象地址的最起始处,而如果我们 B* b=new C; 现在b指向的起始是类中B subobject处,也就是说使用B类作为基类指针的话指向的不是起始处。 但是当我们调用析构函数时,比如delete b时,此时 应该将b再调整至类的起始地址处 。 在单一继承时候是不存在这个问题的,因为只有一个基类,指针也一直指向类的起始地址,而 当加入多重继承 , 且经由非最左边的类的指针 来delete时, 需要在delete前将指针在调整至类的起始处 ,因为一开始b并不是指向起始,而是指向B subobject处的。 class A { public: virtual ~A() { cout<<"a bybye"

c++ 多态

与世无争的帅哥 提交于 2019-11-27 13:51:38
一、 多态 即多种形态。 当 类之间存在层次结构 ,并且类之间是 通过继承 关联时,就 会用到多态 。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数 #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape{ public: Rectangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape{ public: Triangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Triangle class area :" <

深度探索c++对象模型(一)

两盒软妹~` 提交于 2019-11-27 12:46:49
vs调试技巧: F5调试 F9加断点 shift+F9 :查看变量内存地址 1. 对象 1.1 sizeof(空类)== 1 1.2 类的成员函数不占用 类对象 的内存空间 1.3 静态成员变量属于类,不占用 类对象 的内存空间 1.4 虚函数 虚函数表一般是保存在可执行文件中的,在程序执行的时候载入到内存中来 1.5 this指针调整 来源: https://blog.csdn.net/zxt_1/article/details/99346914

C++多态有哪几种方式?

て烟熏妆下的殇ゞ 提交于 2019-11-27 08:46:30
C++多态方式: (1)静态多态(重载,模板) 是在 编译的时候 ,就确定调用函数的类型。 (2)动态多态(覆盖,虚函数实现) 在 运行的时候 ,才确定调用的是哪个函数,动态绑定。运行基类指针指向派生类的对象,并调用派生类的函数。 虚函数实现原理:虚函数表和虚函数指针。 纯虚函数: virtual int fun() = 0; 多态基础介绍: =============================================================================================== 首先,什么是多态(Polymorphisn)?按字面的意思就是"多种形状"。我手头的书上没有找到一个多态的理论性的概念的描述。 暂且引用一下 Charlie Calverts的对多态的描述吧——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4 编程技术内幕")。 简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。 好,接着是"虚函数"(或者是"虚方法")。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为