标签:
C++中的多态是指同一个方法在基类和派生类中有不同的行为,实现多态有两种重要的机制:在派生类中重新定义方法或者使用虚方法。在派生类中重新定义方法会将原方法覆盖,下面主要介绍虚函数。
(1)虚函数声明:
我们在Bank类中使用关键字virtual声明了四个虚函数。
(2)虚函数的作用:
<1> 假如方法不是通过对象调用,而是通过引用或指针,它能通过引用或指针所指向的对象的类型来选择方法;
1 class Bank 2 { 3 public: 4 Bank(string _name) 5 { 6 name = _name; 7 } 8 string getName() const 9 { 10 return name; 11 } 12 virtual void printMessage() const = 0; 13 virtual void deposit(double m) = 0; 14 virtual void withdraw(double m) = 0; 15 virtual double getMoney() const = 0; 16 protected: 17 string name; 18 }; 19 //*************// 20 class ICBC : public Bank 21 { 22 public: 23 ICBC(double _money = 0):Bank("ICBC") 24 { 25 money = _money; 26 } 27 void printMessage() const 28 { 29 cout << "This is ICBC" << endl; 30 } 31 void deposit(double m) 32 { 33 money += m; 34 } 35 void withdraw(double m) 36 { 37 if (money > m) money -= m; 38 else money = 0; 39 } 40 double getMoney() const 41 { 42 return money; 43 } 44 private: 45 double money; 46 }; 47 //****************// 48 class ABC : public Bank 49 { 50 public: 51 ABC(double _money = 0):Bank("ABC") 52 { 53 money = _money; 54 } 55 void printMessage() const 56 { 57 cout << "This is ABC" << endl; 58 } 59 void deposit(double m) 60 { 61 money += m; 62 } 63 void withdraw(double m) 64 { 65 if (money > m) money -= m; 66 else money = 0; 67 } 68 double getMoney() const 69 { 70 return money; 71 } 72 private: 73 double money; 74 };
比如我们在上述代码中声明了另外两个派生类,此时我们在主函数中代码如下:
由于派生类ICBC和ABC都有自己的printMessage()方法,所以此时bank1和bank2虽然都是Bank类型的指针,但是它们能根据自己实际指向的派生类来调用相应的类方法:
而假若我们把基类的virtual关键字去掉:
此时程序运行的结果便是:
两个指针直接调用了基类的printMessage()方法。
<2>假如我们想将基类和派生类储存在同一个数组内,直接使用对象数组是不行的,不过声明一个指向基类对象的指针数组,由于基类的指针可以指向派生类,所以可以使用这个数组来储存基类和派生类。此时基类和派生类可以各自使用其虚函数,例如,我们可以声明一个指针数组来存储Bank类型的指针:
这样基类和不同的派生类就被我们储存在同一个数组里,并且其各自的类方法不会相互影响。
(3)虚拟构造函数:
假如构造函数不是虚拟的,则将之调用与指针类型相对应的析构函数。所以在上述数组中,派生类被销毁时调用了其自身的析构函数,假如基类中没有声明虚拟析构函数,则会调用基类的析构函数,此时派生类的析构函数中的语句不会被执行。所以我们假如希望派生类的被销毁时执行某段代码,我们便要在基类中声明虚拟构造函数。
//End.
标签:
原文地址:http://www.cnblogs.com/Vincent-Bryan/p/5401556.html