互联网几道常考易错笔试题总结

转载于http://blog.csdn.net/chhuach2005/article/details/40322895

1)  覆盖 重载 隐藏

覆盖:基类定义的虚函数,派生类中重新定义,派生类的虚函数表将覆盖基类已定义的虚函数。

重载:重载发生在同一个类中,重载不能跨类。重载是因为函数名相同,函数的参数个数或参数的类型不同,而调用相应的函数。

隐藏:这个,以前没怎么注意。隐藏发生在派生类中有何基类同名的虚函数时,此时基类中的同名重载函数不被继承到派生类。

代码说明如下:

[cpp] view plaincopy

  1. class Base//基类中fun1有3个函数,是重载
  2. {  
  3. public:  
  4. virtual void fun1(int a)  
  5.     {  
  6.         cout<<"Base fun1 int  "<<a<<endl;  
  7.     }  
  8. virtual void fun1(double a)  
  9.     {  
  10.         cout<<"Base fun1 double  "<<a<<endl;  
  11.     }  
  12. void fun1()  
  13.     {  
  14.         cout<<"Base fun1 ()  "<<5<<endl;  
  15.     }  
  16. };  
  17. class Derive:public Base // 显然派生类中的fun1(int a)是基类的fun1(int a)的重写
  18. {  
  19. public:  
  20. virtual void fun1(int a)  
  21.     {  
  22.         cout<<"Derive fun1 int  "<<a<<endl;  
  23.     }  
  24. };  
  25. int _tmain(int argc, _TCHAR* argv[])  
  26. {  
  27.     Base *p=new Derive;//隐藏的函数,用指针可以调用,隐藏和多态同时出现时,隐藏优先级高
  28.     p->fun1(3.3);//由于隐藏优先级高,此处用基类指针调用fun1(3.3),不会发生多态,调用的是基类的fun1(3.3),在基类又会产生重载。
  29.     p->fun1(3);  //多态调用派生类中的函数
  30.     p->fun1();   //同理会调用基类的fun1()函数,在基类会有重载。
  31.     Derive *p1=new Derive;  
  32.     p1->fun1(3.3);//因为派生类没有继承fun1(double),因此fun1(3.3)会调用fun1(int)
  33. //p1->fun1();//由于fun1()未被继承到派生类中,本行调用若不注释,会出错编译不通过。
  34.     Base *p2=new Base;  
  35.     p2->fun1(3.3);  
  36.     system("pause");  
  37. return 0 ;  
  38. }  

运行结果:

结果如图1所示,与以上分析相同

图1  重载、覆盖、隐藏

2)  类变量的声明与执行顺序

且看以下代码

[cpp] view plaincopy

  1. class A  
  2. {  
  3. public:  
  4.     A()  
  5.     {  
  6.         cout<<"A is called"<<endl;  
  7.     }  
  8. };  
  9. class B  
  10. {  
  11. public:  
  12.     B()  
  13.     {  
  14.         cout<<"B is called"<<endl;  
  15.     }  
  16. };  
  17. class C  
  18. {  
  19. public:  
  20.     C()  
  21.     {  
  22.         cout<<"C is called"<<endl;  
  23.     }  
  24. };  
  25. class D  
  26. {  
  27. public:  
  28.     D()  
  29.     {  
  30.         cout<<"D is called"<<endl;  
  31.     }  
  32. };  
  33. void test()  
  34. {  
  35. static C c;  
  36.     D d;  
  37. }  
  38. A a;  
  39. int _tmain(int argc, _TCHAR* argv[])  
  40. {  
  41.         test();  
  42.        system("pause");  
  43. return 0 ;  
  44. }  
  45. B b;  

你觉得构造的顺序到底是怎样的呢?是main()函数体先执行还是b先构造呢?

执行结果为图2,从图2中可以看出,是先构造类的全局变量的,哪怕它在main函数之后,在main函数里的类变量构造是按类变量的定义顺序构造的。

图2  类变量的构造顺序

3)  Main函数能递归吗

[cpp] view plaincopy

  1. int  main()  
  2. {  
  3. static int n=5;  
  4.     cout<<n<<endl;  
  5.     n--;  
  6. if (n==0)  
  7.     {  
  8.         system("pause");  
  9. return 0 ;  
  10.     }  
  11.     main();  
  12. }  

实际测试是可以递归的 运行结果如下:

          图3   main()递归

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术专栏

Python3入门与实践(四): 面向对象

==当通过 student.name获取变量值的时候,首先会查找实例变量里有没有name属性,如果有则返回,如果没有就会去类变量里找,如果还是没有则会报错==

9620
来自专栏JetpropelledSnake

Python面试题之Python中的类和实例

类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规范,从这个角度来看,在以后...

14920
来自专栏Jackson0714

正则表达式全部符号解释

368150
来自专栏Danny的专栏

【J2SE快速进阶】——Java中的equals和==的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

8420
来自专栏wym

运算符重载(超详细)

C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋...

18920
来自专栏Python疯子

python列表,字典排序使用小知识点

15170
来自专栏liukaili_666888999

Swift变量 常量

11520
来自专栏和蔼的张星的图像处理专栏

702. 连接两个字符串中的不同字符

连接两个字符串中的不同字符。 给出两个字符串, 你需要修改第一个字符串,将所有与第二个字符串中相同的字符删除, 并且第二个字符串中不同的字符与第一个字符串的不...

15410
来自专栏Jackson0714

正则表达式全部符号解释

11560
来自专栏顶级程序员

史上最全的Python面向对象知识点疏理

源 / Python编程 文 / 朱小朱 面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类...

40350

扫码关注云+社区

领取腾讯云代金券