【校园招聘】一道笔试题看c++中virtual覆盖
2012-09-17 20:12
148 查看
#include<iostream> using namespace std; class A { public: void virtual f() { cout<<"A"<<endl; } }; class B:public A { public: void /*virtual*/ f() //virtual可以省略,也可以不省略,效果相同。 { cout<<"B"<<endl; } }; int main() { A *pa = new A(); pa->f(); B *pb = (B*)pa; pb->f(); delete pa,pb; pa = new B();//多态 pa->f(); pb = (B*)pa; pb->f(); return 0; }
本题的答案是:AABB
Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。(关于虚拟机制是如何实现的,参见Inside the C++
Object Model ,Addison Wesley 1996)
class Base
{
public:Base(){}
public:
virtual void print(){cout<<"Base";}
};
class Derived:public Base
{
public:Derived(){}
public:
void print(){cout<<"Derived";}
};
int main()
{
Base *point=new Derived();
point->print();
}
Output:
Derived
这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:
(1) 重载的几个函数必须在同一个类中;
覆盖的函数必须在有继承关系的不同的类中
(2) 覆盖的几个函数必须函数名、参数、返回值都相同;
重载的函数必须函数名相同,参数不同。参数不同的目的就是为了在函数调用的时候编译器能够通过参数来判断程序是在调用的哪个函数。这也就很自然地解释了为什么函数不能通过返回值不同来重载,因为程序在调用函数时很有可能不关心返回值,编译器就无法从代码中看出程序在调用的是哪个函数了。
(3) 覆盖的函数前必须加关键字Virtual;
重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。
相关文章推荐
- PPS 2013年校园招聘C++开发工程师笔试题
- PPS 2013校园招聘 研发类笔试题目(C++)
- 2016多益网络春季实习校园招聘笔试回顾(C++游戏后台开发)
- 2012人人网校园招聘杭州站C++笔试题目
- 【面试笔试-c/c++】人民搜索2012校园招聘试题
- 百度2013年校园招聘一道笔试题--三位密码组合问题递归求解
- 数码视讯2015秋季校园招聘C++笔试题
- 详解一道C++笔试题,考察重载、覆盖、多态
- 详解一道C++笔试题,考察重载、覆盖、多态
- 一道Nvidia 校园招聘笔试题
- 阿里巴巴2014校园招聘笔试最后一道题目
- 百度2010校园招聘中的一道有意思的笔试题
- 详解一道C++笔试题,考察重载、覆盖、多态
- 【面试笔试-c/c++】2012年9月土豆优酷网校园招聘笔试
- TCL集团2013校园招聘C/C++方向笔试题
- 2012人人网校园招聘杭州站C++笔试题目
- 【面试笔试-c/c++】2013年校园招聘创新工场笔试题(北邮场)
- 【面试笔试-c/c++】百度2011年校园招聘总结
- 【面试笔试-c/c++】兰亭集势2013校园招聘试题。
- 阿里巴巴2014校园招聘笔试最后一道题目