首先看下边的代码,先创建一个父类,然后在来一个继承父类的子类,两个类中都有自己的 play() 方法,在代码的第35-37行,创建一个父类指针,然后将子类地址引用赋值给父类,这时调用 P 指针的 play() 方法会打印出什么呢。开始我以为会是调用子类的 play() 方法,因为第36行给引用了,但打印结果是:
这是个父类的play
1 #include <iostream> 2 3 class Father 4 { 5 public: 6 void play() 7 { 8 std::cout << "这是个父类的play" << std::endl; 9 } 10 }; 11 12 class Son : public Father 13 { 14 public: 15 void play() 16 { 17 std::cout << "这是个子类的Play" << std::endl; 18 } 19 }; 20 21 22 void party(Father** men, int num) 23 { 24 for (int i = 0; i < num; i++) 25 { 26 men[i]->play(); 27 } 28 } 29 30 int main() 31 { 32 Father father; 33 Son son; 34 35 Father* p; //定义一个父类的指针 P 36 p = &son; //指针引用子类地址 37 p->play(); //访问指针中的 play() 方法,访问的会是子类的 play() 么? 38 39 }
通过父类的指针来访问子类中的方法,这种情况在项目中经常会遇到。如果想通过一个父类的指针访问子类中的方法怎么办呢?只需要在父类的相关方法前增加一个关键字:virtual
如下代码:
1 #include <iostream> 2 3 class Father 4 { 5 public: 6 virtual void play() //在父类 play() 方法前增加 virtual 关键字 7 { 8 std::cout << "这是个父类的play" << std::endl; 9 } 10 }; 11 12 class Son : public Father 13 { 14 public: 15 void play() 16 { 17 std::cout << "这是个子类的Play" << std::endl; 18 } 19 }; 20 21 22 void party(Father** men, int num) 23 { 24 for (int i = 0; i < num; i++) 25 { 26 men[i]->play(); 27 } 28 } 29 30 int main() 31 { 32 Father father; 33 Son son; 34 35 Father* p; //定义一个父类的指针 P 36 p = &son; //指针引用子类地址 37 p->play(); //访问指针中的 play() 方法,访问的会是子类的 play() 么? 38 39 }
运行结果为:
这是个子类的Play
总结:
这就是使用多态之后的结果,多态就是通过一个父类的指针,能够调用父类与子类他们各自的方法。如果不使用多态,调用子类的方法时也会执行父类的方法。
==========================================================================================================================
原文链接: https://www.cnblogs.com/CooCoChoco/p/12543889.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/336857
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!