首先看下边的代码,先创建一个父类,然后在来一个继承父类的子类,两个类中都有自己的 play() 方法,在代码的第35-37行,创建一个父类指针,然后将子类地址引用赋值给父类,这时调用 P 指针的 play() 方法会打印出什么呢。开始我以为会是调用子类的 play() 方法,因为第36行给引用了,但打印结果是:
这是个父类的play
1 #include
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
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
总结:
这就是使用多态之后的结果,多态就是通过一个父类的指针,能够调用父类与子类他们各自的方法。如果不使用多态,调用子类的方法时也会执行父类的方法。
==========================================================================================================================
手机扫一扫
移动阅读更方便
你可能感兴趣的文章