C++中函数重载和重写的区别是什么?
函数重载:
利用命名矫正(name mangling)技术,在编译时把函数名加上参数的首字母来区分同名函数。
需要满足3个条件:
1.同一个作用域下
2.函数名相同
3.函数参数类型不同,参数个数不同,参数顺序不同
示例:
1 //函数重载需要函数都在同一个作用域下 2 void func() 3 { 4 cout << "func 的调用!" << endl; 5 } 6 void func(int a) 7 { 8 cout << "func (int a) 的调用!" << endl; 9 } 10 void func(double a) 11 { 12 cout << "func (double a)的调用!" << endl; 13 } 14 void func(int a ,double b) 15 { 16 cout << "func (int a ,double b) 的调用!" << endl; 17 } 18 void func(double a ,int b) 19 { 20 cout << "func (double a ,int b)的调用!" << endl; 21 } 22 23 //函数返回值不可以作为函数重载条件 24 //int func(double a, int b) 25 //{ 26 // cout << "func (double a ,int b)的调用!" << endl; 27 //} 28 29 30 int main() { 31 32 func(); 33 func(10); 34 func(3.14); 35 func(10,3.14); 36 func(3.14 , 10); 37 38 system("pause"); 39 40 return 0; 41 }
函数重写:
在基类的函数前加virtual关键字,在派生类重写改函数,运行时根据对象的实际类型来调用相应的函数。
重写需要满足:
1.函数返回值相同
2.函数名相同
3.函数参数相同
4.但函数体不同
示例:
1 class Animal 2 { 3 public: 4 virtual void speak() 5 { 6 cout << "动物在说话" << endl; 7 } 8 }; 9 10 class Cat :public Animal 11 { 12 public: 13 void speak() //重写,返回值相同,函数名相同,函数参数相同 14 { 15 cout << "小猫在说话" << endl; 16 } 17 }; 18 19 20 void test01() 21 { 22 Cat cat; 23 DoSpeak(cat); 24 } 25 26 27 int main() { 28 29 test01(); 30 31 system("pause"); 32 33 return 0; 34 }