码迷,mamicode.com
首页 > 编程语言 > 详细

C++虚函数

时间:2016-04-27 01:32:06      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:


     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 };
View Code 

      比如我们在上述代码中声明了另外两个派生类,此时我们在主函数中代码如下:

      技术分享

      由于派生类ICBC和ABC都有自己的printMessage()方法,所以此时bank1和bank2虽然都是Bank类型的指针,但是它们能根据自己实际指向的派生类来调用相应的类方法:

      技术分享

      而假若我们把基类的virtual关键字去掉:

      技术分享

      此时程序运行的结果便是:

      技术分享

      两个指针直接调用了基类的printMessage()方法

      <2>假如我们想将基类和派生类储存在同一个数组内,直接使用对象数组是不行的,不过声明一个指向基类对象的指针数组,由于基类的指针可以指向派生类,所以可以使用这个数组来储存基类和派生类。此时基类和派生类可以各自使用其虚函数,例如,我们可以声明一个指针数组来存储Bank类型的指针:

      技术分享

      这样基类和不同的派生类就被我们储存在同一个数组里,并且其各自的类方法不会相互影响。

    (3)虚拟构造函数:
      假如构造函数不是虚拟的,则将之调用与指针类型相对应的析构函数。所以在上述数组中,派生类被销毁时调用了其自身的析构函数,假如基类中没有声明虚拟析构函数,则会调用基类的析构函数,此时派生类的析构函数中的语句不会被执行。所以我们假如希望派生类的被销毁时执行某段代码,我们便要在基类中声明虚拟构造函数。

 

    //End.

C++虚函数

标签:

原文地址:http://www.cnblogs.com/Vincent-Bryan/p/5401556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!