c++之虚函数和基类指针

  1. 基类指针虽然获取派生类对象地址,却只能访问派生类从基类继承的成员
 1 #include <iostream>
 2 using namespace std;
 3 
 4 //通过基类指针只能访问从基类继承的成员
 5 class A
 6 {
 7 public:
 8     A(char x)
 9     {
10         this->x = x;
11     }
12     //void virtual who()    //基类定义虚函数,则派生类的重定义版本默认为虚函数
13     void who()    //除非定义虚函数,否则基类指针无法访问派生类的非继承的成员
14     {
15         cout << "A class" << x << endl;
16     }
17 protected:
18     char x;
19 };
20 
21 class B:public A
22 {
23 public:
24     B(char x,char y):A(x)
25     {
26         this->y = y;
27     }
28     void who()
29     {
30         cout<< "B class" << x << "," << y<< endl;
31     }
32 protected:
33     char y;
34 };
35 class C:public B
36 {
37 public:
38     C(char x,char y,char z):B(x,y)
39     {
40         this->z = z;
41     }
42     void who()
43     {
44         cout<< "C class " << x << "," << y << "," << z << endl;
45     }
46 protected:
47     char z;
48 };
49 
50 void main()
51 {
52     A a('A'); 
53     B b('T','O');
54     C c('E','N','D');
55     //定义基类指针
56     A* aa;
57     aa = &a;
58     aa->who();
59     aa = &b;
60     //只能调用从基类继承的函数
61     aa->who();
62     aa = & c;
63     //只能调用从基类继承的函数
64     aa->who();
65     //通过对象调用自身的成员函数
66     b.who();
67     //基类指针做类型转换,调用转换后的类型的类成员函数
68     ((C*)aa)->who();
69 }

2.虚函数和基类指针

注意:

  一个虚函数,在派生类层界面相同的重载函数都保持虚特性
  虚函数必须是类的成员函数
  不能将友元说明为虚函数,但虚函数可以是另一个类的友元
  析构函数可以是虚函数,但构造函数不能是虚函数

3.虚函数的重载特性

 

  在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、

 

  参数类型和顺序完全相同

 

  如果仅仅返回类型不同,C++认为是错误重载

 

  如果函数原型不同,仅函数名相同,丢失虚特性 
 1 例:
 2 class  base
 3 { public : 
 4       virtual  void  vf1 ( ) ;
 5       virtual  void  vf2 ( ) ;
 6       virtual  void  vf3 ( ) ;
 7       void  f ( ) ;
 8  } ;
 9 class  derived : public  base
10 { public : 
11       void  vf1 ( ) ;        // 虚函数
12       void  vf2 ( int ) ;    // 重载,参数不同,虚特性丢失
13       char  vf3 ( ) ;        // error,仅返回类型不同
14       void f ( ) ;        // 非虚函数重载
15  } ;
16 
17 void  g ( ) 
18 { derived   d ;
19    base  * bp = & d ;        // 基类指针指向派生类对象
20    bp -> vf1 ( ) ;            // 调用 deriver :: vf1 ( )
21    bp -> vf2 ( ) ;            // 调用 base :: vf2 ( )
22    bp -> f ( ) ;            // 调用 base :: f ( )
23 } ;

 

 

posted @ 2015-03-13 23:05  溈鉨wo乄菰単  阅读(272)  评论(0编辑  收藏  举报