c++之类指针的关系

1基类指针和派生类指针与基类对象和派生类对象4种可能匹配:

   直接用基类指针引用基类对象;
   直接用派生类指针引用派生类对象;
  用基类指针引用一个派生类对象;
  用派生类指针引用一个基类对象。 
2.基类指针引用派生类对象

例如: 

A    * p ;  // 指向类型 A 的对象的指针

A    A_obj ;  // 类型 A 的对象

B    B_obj ;  // 类型 B 的对象

p = & A_obj ;  // p 指向类型 A  的对象

p = & B_obj ;  // p 指向类型 B  的对象,它是 A 的派生类

  利用 p,可以通过 B_obj 访问所有从 A 类继承的元素 ,

   但不能用 p访问 B 类自定义的元素 (除非用了显式类型转换)

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 
 6 //使用基类指针引用派生类对象
 7 class A
 8 {
 9     char name[20];
10 public:
11     void setName(char* s)
12     {
13         strcpy_s(name,s);
14     }
15     void print()
16     {
17         cout << "name = " << name << endl;
18     }
19 };
20 
21 class B:public A
22 {
23         char phone_num[20];
24 public:
25     void setNum(char* num)
26     {
27         strcpy_s(phone_num,num);
28     }
29     void printNum()
30     {
31         cout << "phone_num = " << phone_num << endl;
32     }
33 };
34 
35 void main()
36 {
37     //基类指针
38     A* ap;
39     //基类对象
40     A a;
41     //派生类对象
42     B b;
43     //基类指针指向基类对象
44     ap = &a;
45     //使用基类指针调用基类的成员函数
46     ap->setName("tangxiaoxue");
47     ap->print();
48     //基类指针指向派生类对象
49     ap = &b;
50     //使用基类指针调用从基类继承的成员函数
51     ap->setName("dujingui");
52     ap->print();
53     //使用派生类对象调用派生类的成员函数
54     b.setNum("15110711517");
55     //对基类指针进行强类型转换,调用派生类的成员函数
56     ((B*)ap)->printNum();
57 }

3.派生类指针引用基类对象

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Data
 5 {
 6 public:
 7     Data(int y,int m,int d)
 8     {
 9         setData(y,m,d);
10     }
11     void setData(int y,int m,int d)
12     {
13         year = y;
14         mouth = m;
15         day = d;
16     }
17     void print()
18     {
19         cout << year << "-" << mouth << "-" << day << ";";
20     }
21 protected:
22     int year,mouth,day;
23 };
24 
25 class DataTime:public Data
26 {
27 public:
28     DataTime(int y,int m,int d,int h,int mi,int s):Data(y,mi,d)
29     {
30         setTime(h,mi,s);
31     }
32     void setTime(int h,int m,int s)
33     {
34         hours = h;
35         minutes = m;
36         second = s;
37     }
38     void print()
39     {
40         //对this指针做类型转换,调用基类的成员函数
41         //((Data*)this)->print();等价于Data::print()
42         Data::print();
43         cout << hours << ":" << minutes << ":" << second << endl;
44     }
45 private:
46     int hours,minutes,second;
47 };
48 
49 void main()
50 {
51     DataTime d(1995,12,14,12,14,16);
52     d.print();
53 }

 

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