C++题目下

1)下面两段代码的输出分别是什么?

(1)第一个,Print in Base

Print in Derive

(2)第二个,Print in Base

Print in Base

2)简述C++虚函数作用及底层实现原理

作用:简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,实现多态性(Polymorphism),多态性是将接口与实现进行分离,就是实现以共同的方法,但因个体差异而采用不同的策略。

可以让成员函数操作一般化,用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,则会调用其真正指向对象的成员函数,而不是基类中定义的成员函数(只要派生类改写了该成员函数)。若不是虚函数,则不管基类指针指向的哪个派生类对象,调用时都会调用基类中定义的那个函数。

虚函数是动态绑定的基础。是非静态的成员函数。在类的声明中,在函数原型之前写virtual。virtual 只用来说明类声明中的原型,不能用在函数实现时。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。本质:不是重载声明而是覆盖。调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。

底层实现:当一个类中有虚函数存在,所以编译器就会为它插入一段你不知道的数据,并为他们分别创建一个表。那段数据叫做vptr指针,指向那个表。那个表叫做vtbl,每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址。当别的类继承这个类时,

3)一个对象访问普通成员函数和虚函数哪个更快?

访问成员函数更快,因为当调用虚函数的时候,必须通过虚指针访问虚表从而得到函数的地址,称为动态多态。而普通成员函数在编译时已确定函数地址。

4)在什么情况下,析构函数需要是虚函数?

当其会被继承且子类中可能存在指针的时候。(此指针在析构时需释放空间)

当析构函数声明为虚函数时,基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。

5)内联函数、构造函数、静态成员函数可以是虚函数吗?

都不可以。

注:inline, static, constructor三种函数都不能带有virtual关键字。

inline是编译时展开,必须有实体;

static属于class自己的,也必须有实体;

virtual函数基于vtable(内存空间),constructor函数如果是virtual的,调用时也需要根据vtable寻找,但是constructor是virtual的情况下是找不到的,因为constructor自己本身都不存在了,创建不到class的实例,没有实例,class的成员(除了public static/protected static for friend class/functions,其余无论是否virtual)都不能被访问了。

C++函数中那些不可以被声明为虚函数

常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。

1.为什么C++不支持普通函数为虚函数?

普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。

2.为什么C++不支持构造函数为虚函数?

这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完全了解细节的情况下也能正确处理对象。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。(这不就是典型的悖论)

3.为什么C++不支持内联成员函数为虚函数?

其实很简单,那内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。(再说了,inline函数在编译时被展开,虚函数在运行时才能动态的邦定函数)

4.为什么C++不支持静态成员函数为虚函数?

这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定的必要性。

5.为什么C++不支持友元函数为虚函数?

因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法

6)构造函数中可以调用虚函数吗?

这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完全了解细节的情况下也能正确处理对象(对象不完整)。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。(这不就是典型的悖论)。

时间: 2024-08-10 15:10:32

C++题目下的相关文章

POJ 2656 Unhappy Jinjin(水题)

[题意简述]:找到两数之和最大的那一天. [分析]:这个....代码就贴在题目下啊. #include <stdio.h> int main(){ while(1) { int i, n; int maxday, maxvalue = -1; scanf("%d", &n); if (n == 0) break; for (i = 1; i <= n; i++) { int a, b; scanf("%d%d", &a, &

CTF中关于pwn题如何加载目标libc的方法

问题:在做pwn题的过程中,我们经常会遇到题目提供libc,但是本地调试的时候加载的是本地libc. 解决方法: 方法1: 可以用添加环境变量的方法,如下: export LD_LIBRARY_PATH=`pwd` #当前目录为加载目录export LD_PRELOAD=你的libc #加载本地pwn题目下的libc 最后不用了在:unset LD_PRELOAD #调试完记得删除环境变量 但是这个方法在ubuntu为64位系统而调试程序为32位程序时会导致libc无法加载的情况,如图 这是在我

计算机科学工作坊检测抄袭意见书

计算机科学工作坊检测抄袭意见书 Dick Grune Matty Huntjens Vakgroep Informatica Faculteit Wiskunde & Informatica Vrije Universiteit De Boelelaan 1081 1081 HV AMSTERDAM November 1989 摘要 在大多数计算机科学研讨会中,学生提交作业由多个主管评分.这将可能产生一个学生提交的工作已经被另一个学生在此之前以最小的被发现的可能性提交到另一个主管的情况.这将导致

刘以鬯和香港文学

http://www.readers365.com/dushu20nian/88/120599.htm 如果你知道刘以鬯,你就可以多认识一个字了:“鬯”. 鬯字怎么读?畅.什么意思?一是古时的香酒,二是古时的祭器,三是古时的供酒官,四是郁金香草,五是和“畅”字通,鬯茂,鬯遂就是畅茂,畅遂. 不过,虽然知道刘以鬯许多年,认识他又许多年,我还是在此刻动笔之前,才从<辞源>中翻查出这许多来的,这以前我只是知道“鬯”读畅,是酒器而已(这并不对). 不过,不认识这个“鬯”字没有多大关系,重要的是认识刘以

读明清等中国近代小说感想

空闲的时候,我也读明清小说,比如<三国演义>,我已经读了好几遍了. 由于宋代前后﹐手工业和商业的发展带来了都市的繁荣﹐为当时的民间说唱艺术的发展提供了场所和观众﹐不断扩大的市民阶层对文化娱乐的需求又大大地刺激了这种发展﹐从而产生出新的文学样式,这就是小说.小说的一出现,打破了正统诗文的垄断,以可感的形象和故事的动人走进了千家万户. <三国演义>是由元末明初的罗贯中初写定.此书生动描述了东汉末年群雄割据﹐三国鼎立﹐最後司马氏统一天下的复杂历史﹐结构宏伟﹐场面壮观﹐人物众多.有些人物颇

阿里巴巴2016数据挖掘工程师真题在线测

1.想要了解上海市小学生的身高,需要抽取500个样本,这项调查中的样本是? A.从中抽取的500名学生的身高 B.上海市全部小学生的身高 C.从中抽取的500名小学生 D.上海市全部小学生 2.以下对k-means聚类算法解释正确的是 A.能自动识别类的个数,随即挑选初始点为中心点计算 B.能自动识别类的个数,不是随即挑选初始点为中心点计算 C.不能自动识别类的个数,随即挑选初始点为中心点计算 D.不能自动识别类的个数,不是随即挑选初始点为中心点计算 3.以下哪个是常见的时间序列算法模型 A.R

C#认证第一章1 题 11题

C#第一章第一题 C#认证第一章  11题

[poj2104]可持久化线段树入门题(主席树)

解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序列的第k小,我们会想到离散化二分和线段树的做法, 而主席树只是保存了序列的前缀和,排序之后,对序列的前缀分别做线段树,具有差分的性质,因此可以求任意区间的第k小,如果主席树维护索引,只需要求出某个数字在主席树中的位置,即为sort之后v中的索引:若要求第k大,建树时反向排序即可 1 #include

旧题新做:从idy的视角看数据结构

“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 second 给你一个长度为N 的整数序列,支持两种操作: • modity l r val 将区间[l,r] 中的所有数修改为val • query l r 询问区间[l,r] 所有数的和 分析:最简单的线段树,区间更改区间求和.但注意是更改,不是添改,sum与flag需同时覆盖. Problem 2.