码迷,mamicode.com
首页 > 编程语言 > 详细

C++重载,覆盖,隐藏的各种问题

时间:2015-09-06 17:41:07      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

一、成员函数被重载的特征:
  (1)相同的范围(在同一个类中);   (2)函数名字相同;   (3)参数不同;

  (4)virtual 关键字可有可无。

二、覆盖的特征:

  (1)不同的范围(基类和派生类)

  (2)函数名字相同;

  (3)参数相同;

  (4)virtual关键字必须有(基类);

三、隐藏的特征:

  (1)不同的范围(基类和派生类)

  (2)函数名字相同;

  (3)参数相同&&无virtual关键字(基类);

  (4)参数不同,virtual关键字可有可无;

以下代码符合什么特征呢?

 1 class A {
 2 public:
 3     virtual void Fun(int B = 10){
 4         cout <<"A Fun:" << B << endl;
 5     }
 6 };
 7 
 8 class B : public A {
 9 public:
10     void Fun(int B = 20){
11         cout <<"B Fun:" << B << endl;
12     }
13 };
14 
15 int main()
16 {
17     B b;
18     A &a = b;
19     a.Fun();
20 }

此处输出的为B Fun: 10;这个答案令我思考了很久,B Fun是由于覆盖机制但是10是如何得到的呢?我对exe逆向后发现该10在编译时就已经确定了,那么是什么机制让编译器认定这个参数值为10呢?而不是20。 A &a其实本身还是在A内部调用函数因此该函数参数来自A的默认参数int B = 10;可能你有疑问:(学习就是要多思考)

以下代码符合什么特征呢:

技术分享
 1 class A {
 2 public:
 3     void Fun(int B = 10){
 4         cout <<"A Fun:" << B << endl;
 5     }
 6 };
 7 
 8 class B : public A {
 9 public:
10     void Fun(int B = 20){
11         cout <<"B Fun:" << B << endl;
12     }
13 };
14 
15 int main()
16 {
17     B b;
18     A &a = b;
19     a.Fun();
20 }
View Code

可能会以为是同一代码,仔细看会发现基类的virtual不见了;此处输出为A Fun: 10;这里的a指向"A"的地址并调用Fun函数;

思考了一个强转问题(待补);

C++重载,覆盖,隐藏的各种问题

标签:

原文地址:http://www.cnblogs.com/Fr2eW0lf/p/4786463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!