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

it2022-05-07  3

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

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

 

转载于:https://www.cnblogs.com/Fr2eW0lf/p/4786463.html


最新回复(0)