c++拾遗(二)
- 虚函数
使得在基类声明的函数能够在各个派生类里面重新定义。比如下面这个例子
1: #include <iostream>
2: #include <string>
3: using namespace std;
4: class Employee{
   5:     string first_name, family_name;
6: short department;
7: public:
8: Employee(const string &n, int d);
9: virtual void print() const;
  10: };
11: void Employee::print()const{
  12:     cout<<family_name<<department<<endl;
  13: }
14: Employee::Employee(const string &n, int d):first_name(n),department(d){}
15: class Manager:public Employee{
16: //list<Employee*> group;
17: short level;
18: public:
19: Manager(const string &n, int d, int lvl);
20: void print()const;
  21: };
22: Manager::Manager(const string &n, int d , int lvl):Employee(n,d),level(lvl){}
23: void Manager::print() const
  24: {
  25:     Employee::print();
  26:     cout<<level<<endl;
  27: }
28: int main()
  29: {
30: Employee e("Brown",1234);
31: Manager m("Smith",1234,2);
  32:     e.print();
  33:     m.print();
  34:     Employee *p = &e;
  35:     p->print();
  36:     p = &m;
  37:     m.print();
  38:     Manager *q = &m;
  39:     q->print();
  40:  
  41: }
基类声明了一个虚函数 virtual void print() const; 用来打印类成员的信息。在基类和派生类中分别定义print函数的具体内容。
在实现中定义一个指向基类对象的指针,分别用基类和派生类的对象地址赋值。然后通过指针调用print函数,可以发现,调用的分别是基类和派生类定义的print函数。
对于给定的类型为base*的指针,被指的对象到底属于哪个派生类呢?通过虚函数,我们解决了这个问题。程序的输出为:
   1: 1234
   2: 1234
   3: 2
   4: 1234
   5: 1234
   6: 2
   7: 1234
   8: 2
 
                     
                    
                 
                    
                 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号