class A {
public:
A() {}
(virtual) void print() {
cout << "This is A." << endl;
}
};
class B : public A {
public:
B() {}
void print() {
cout << "This is B." << endl;
}
};
int main(int argc, char* argv[]) {
B b;
A a; a = b;a.print;
return 0;
}
那么这里输出的是This is B,如果把virtual去掉,那么输出This is A,加上virtual ,多态了,B中的print被调用了,也就是可以实现父类使用子类的方法。
多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作。把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(也就是可以调用子对象中对父对象的相关函数的改进方法)。
当编译器遇到virtual后,会为所在的类构造一个表和一个指针,那个表叫做vtbl,每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址.指针叫做vptr,指向那个表。而这个指针保存在相应的对象当中,也就是说只有创建了对象以后才能找到相应虚函数的地址。
注意
(1)为确保运行时的多态定义的基类与派生类的虚函数不仅函数名要相同,其返回值及参数都必须相同,否则即使加上了virtual,系统也不进行迟后联编。
(2) 虚函数关系通过继承关系自动传递给基类中同名的函数,也就是上例中如果A中print有virtual,那么 B中的print即使不加virtual,也被自动认为是虚函数。
(3) 没有继承关系,多态机制没有意义,继承必须是公有继承
(4)现实中,远不只我举的这两个例子,但是大的原则都是我前面说到的“如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的”。这句话也可以反过来说:“如果你发现基类提供了虚函数,那么你最好override它”。
2.代码的鲁棒性
我当时回答了鲁棒性相当于代码的健壮性,但是之后扯到了扩展性,有点失策...
健壮性是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式。健壮性就是鲁棒性,是指一个程序中对可能导致程序崩溃的各种情况都充分考虑到,并且作相应的处理,在程序遇到异常情况时还能正常工作,而不至于死机。
3.C与C++的区别
第一点就应该想到C是面向过程的语言,而C++是面向对象的语言,一般简历上第一条都是熟悉C/C++基本语法,了解C++面向对象思想,面向对象的三大特性:封装、继承、多态
第二点C和C++动态管理内存的方法不一样,C是使用malloc/free函数,而C++除此之外还有new/delete关键字;
(malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符,对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数)
第三点C++的类是C所没有的,但是C中的struct是可以在C++中正常使用的
第四点C++支持函数重载,而C不支持函数重载
第五点C++中有引用,而C没有;这样就不得不提一下引用和指针的区别
指针是一个实体他在栈中有自己使用的空间,但是引用没有
引用必须初始化,指针不用但是最好初始化
引用只能初始化一次是个专一的人,指针不是
指针和地址运用自增(++)不同,引用是值进行自增,而指针是地址进行自增
面试是下午一点半开始,进去先填写一个表格和做一份C++研发工程师题,题目都很基础,随意写了一下,题目中比较有新意的是有关于C++11的auto 以及lambda函数,还有就是关于斗地主中三个玩家和服务器之间的发牌、叫分、打牌的补充逻辑示意图,之后就是最后一道最喜欢哪种类型的游戏以及相应的理由。
技术面,面我的直接就是杭电毕业的学长,面试过程中发现也同样是老乡,感觉十分有缘,一开始就是自我介绍,我分别从学习上,科研竞赛上(本人读研期间做的事情真的挺多的,所以balabala了好久,但是面试官并没有不耐烦),还有就是社会工作上来分点介绍自己(真的,思路要清晰,有条理,之后面试官也赞扬我能分点介绍),接着面试官提问关于项目中遇到的困难,怎么去解决,有哪些体现你的学习能力,我直接从我小白身份做过的项目里去介绍这几点,说完面试官很满意,全程笑脸,之后问我看技术书是怎么看的,我说不会从头看到尾,我会先看目录,找到自己项目中相关的信息,然后去做,之后看例子,有个相似的模板就嵌套进去,遇到不懂的再查,面试官也笑了笑,最后面试官就聊了聊该岗位具体要做什么,和我想的差不多,同时也需要做一些前端的事情,之后面试官商量了一下实习时间等,他就去找HR,说如果HR面过了就来实习
HR面,面我的是HR小姐姐,挺有意思的,也问了我项目,同样的回答,HR表示我思路很清晰,之后问了我人生规划以及是否留在杭州,本人表示愿意,然后就是问实习时间还有实习薪资,顿时心里有底了,毕竟并非科班出身,以及自己提了几个问题,关于上班时间,公司规模,具体事物等,HR都一一回答了,聊的也很愉快。
总的来说一次不错的面试经历。
网上笔试结束后,大概过来一星期通知去面试,那天下大雨,路上一个多小时的时间...还把雨伞弄丢了..好气
首先是基础面
1.先介绍自己学习方面(我说了一些自己的奖学金)
2.聊一聊项目经历,其中我说明了自己的SCI论文如何发表,在项目中自己做的事情,面试官答题了解了我做的事和在项目中的作用。
3.是否了解TCP/IP,不了解...
4.多线程,回答thread_create来创建多线程,VS上可以用opm.h头文件来进行多线程
之后技术面
1.自我介绍(我分三个方面:学习,科研和项目,社会工作)
2.迭代与递归的区别,递归会消耗更多内存和时间,迭代则不会
3.如何判断链表中是否有环,可以设置两个快慢指针,快指针向前走两步,慢指针向前走一步,如果两个指针相遇,那么该链表中存在环(追击问题)
4.多线程编写,线程切换
用thread_creat创建多线程,sleep用于线程睡眠,SwitchToThread用于线程切换。
5.是否会快速排序,快速排序的思想,能否将快排的递归转换成迭代
快排采用分治法,分而治之,递归转迭代并不会...
6.字符串中找子串如何实现
strstr()函数,我回答使用动态规划,寻找子结构。
7.用过哪些IDE
code::block,eclipse,VS
8.是否了解过智能指针
auto_ptr,使用完毕可以自动销毁内存。
9.是否做过GUI界面
做过GUI界面,但是是用matlab做的。
最后就是HR面,HR小姐姐挺漂亮的
1.自我介绍(学习方面)
2.学习期间最有成就感的事
发表sci论文
3.最惋惜的事
和女朋友分手
4.大华是否是你心中的理想公司
吹了一波
5.实习日期,一周几天等