1. C++中多态的概念
C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。
2. C++多态问题抛出
下面看一个具体的例子:
1. #include <iostream> 2. #include <stdlib.h> 3. 4. using namespace std; 5. 6. class Animal 7. { 8. public: 9. void speak(void) 10. { 11. cout << "动物在说话" << endl; 12. } 13. 14. }; 15. 16. class Cat :public Animal 17. { 18. public: 19. void speak(void) 20. { 21. cout << "小猫在说话" << endl; 22. } 23. }; 24. 25. void doSpeak(Animal &animal) 26. { 27. animal.speak(); 28. } 29. 30. void doSpeak(Animal *animal) 31. { 32. animal->speak(); 33. } 34. 35. void test01() 36. { 37. Animal animal; 38. Cat cat; 39. 40. doSpeak(animal); 41. doSpeak(cat); 42. 43. Animal *animal_ = new Animal; 44. Cat *cat_ = new Cat; 45. 46. doSpeak(animal_); 47. doSpeak(cat_); 48. 49. } 50. 51. int main(void) 52. { 53. test01(); 54. 55. system("pause"); 56. return 0; 57. }
运行结果如下:
这里运行的结果是:动物在说话。
在Animal类中void speak函数前加上virtual关键字,再次运行,运行结果是:小猫在说话。
分析为什么会出现这种情况:
1> 没有对speak函数加virtual关键字时,此时是静态多态,函数地址在编译阶段已经绑定
2> speak加了virtual关键字之后,此时是动态多态,函数地址在运行时确定
案例分析:
1> 从运行结果来看,无论是使用指针还是引用的形式,去调用speak函数,都是执行基类的speak函数,这个显然不符合多态概念
就是说子类和父类在执行同一个消息时,并没有做出不同的反应
2> 如何解决这个问题?
对于需要重写的函数,在基类的函数前加virtual关键字
子类在重写父类的这个函数时,virtual关键字可加可不加,但是建议加上,这样别人看代码的时候一眼看去就知道这个函数是对父类函数进行重写的