首先看下边的代码,先创建一个父类,然后在来一个继承父类的子类,两个类中都有自己的 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

 

总结:

这就是使用多态之后的结果,多态就是通过一个父类的指针,能够调用父类与子类他们各自的方法。如果不使用多态,调用子类的方法时也会执行父类的方法。

 

 

 

 

 

 

 

 

==========================================================================================================================

分类:

技术点:

相关文章: