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

一、成员函数被重载的特征:
  (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函数;

该处为隐藏机制,由于类在编译时会自动加上this指针即(A::Fun(int B= 10)编译后应该是Fun(A, int)这样的)

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

 

posted @ 2015-09-06 16:38  Fr2eW0lf  阅读(181)  评论(0)    收藏  举报