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 }
时间: 2024-10-29 19:07:01