TIPS:
引发问题的源头是我们使用了new在程序运行的时候才为dog和cat分配Dog类型和Cat类型的指针。这些都是它们在运行时才分配的类型,和它们在编译时的类型是不一样的。
如果拿不准要不要把某种方法声明为虚方法,那么就把它声明为虚方法好了。
在基类里把所有的方法都声明为虚方法会让最终的可执行代码的速度变得稍微慢一些,但好处是可以一劳永逸地确保程序的行为符合你的预期。
实例:虚方法的运用
1 //int *pointer = new int;//声明一个整型指针,并在程序运行时将它指向分配的内存空间
2 //delect *pointer;//删除指针,释放内存
3 #include <iostream>
4 #include <string>
5
6 using namespace std;
7
8 class Pet//定义Pet类
9 {
10 public:
11 Pet(string theName);//构造器,对count进行写操作
12
13 void eat();
14 void sleep();
15 virtual void play();//定义虚方法play,将在编译时为其分配内存
16
17 protected://不允许没有继承Pet类的其它类调用
18 string name;
19 };
20 Pet::Pet(string theName)
21 {
22 name = theName;
23 }
24 void Pet::eat()
25 {
26 cout << name << "正在吃东西!\n";
27 }
28 void Pet::sleep()
29 {
30 cout << name << "正在睡大觉!\n";
31 }
32 void Pet::play()
33 {
34 cout << name << "正在玩儿!\n";
35 }
36
37 class Cat:public Pet//定义Cat类继承于Pet类
38 {
39 public:
40 Cat(string theName);//构造器
41
42 void climb();
43 void play();
44 };
45 Cat::Cat(string theName):Pet(theName)//Cat的构造函数继承于Pet类中的Pet(theName)函数
46 {
47 }
48 void Cat::climb()
49 {
50 cout << name << "正在爬树!\n";
51 }
52 void Cat::play()
53 {
54 cout << name << "玩毛绒球!\n";
55 }
56
57 class Dog:public Pet//定义Dog类继承于Pet类
58 {
59 public:
60 Dog(string theName);//构造器
61
62 void bark();
63 void play();
64 };
65 Dog::Dog(string theName):Pet(theName)//Dog的构造函数继承于Pet类中的Pet(theName)函数
66 {
67 }
68 void Dog::bark()
69 {
70 cout << name << "汪汪汪!\n";
71 }
72 void Dog::play()
73 {
74 Pet::play();
75 cout << name << "正在追赶那只该死的猫!\n";
76 }
77 int main()
78 {
79 Pet *cat = new Cat("加菲");
80 Pet *dog = new Dog("欧迪");
81
82 cat -> sleep();
83 cat -> eat();
84 cat -> play();
85
86 dog -> sleep();
87 dog -> eat();
88 dog -> play();
89
90 delete cat;
91 delete dog;
92
93 return 0;
94 }