标签:
一、成员函数被重载的特征:
(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 }
可能会以为是同一代码,仔细看会发现基类的virtual不见了;此处输出为A Fun: 10;这里的a指向"A"的地址并调用Fun函数;
思考了一个强转问题(待补);
标签:
原文地址:http://www.cnblogs.com/Fr2eW0lf/p/4786463.html