一、组合与继承
举例:
1 #include <iostream> 2 3 class CPerson { 4 public: 5 CPerson() {} 6 ~CPerson() {} 7 //获取性别 8 int GetGender() { 9 return m_nGender; 10 } 11 //设置性别 12 void SetGender(int nGender) { 13 m_nGender = nGender; 14 } 15 private: 16 char m_szName[255]; 17 int m_nGender; 18 }; 19 20 class CStudent 21 { 22 public: 23 CStudent() {} 24 ~CStudent() {} 25 CPerson m_per; //把一个类放到另一个类里做成员--组合关系 26 private: 27 int m_nStuID; 28 }; 29 30 class CTeacher 31 { 32 public: 33 CTeacher() {} 34 ~CTeacher() {} 35 CPerson m_per; 36 private: 37 int m_TeaID; 38 }; 39 40 int main() 41 { 42 CStudent stu; 43 stu.m_per.SetGender(1); 44 return 0; 45 }
在上面我们通过在学生类与教师类中包含person类,来使他们获取person的一些属性。这种关系,我们称之为组合关系
#include <iostream> class CPerson { public: CPerson() {} ~CPerson() {} int GetGender() { return m_nGender; } void SetGender(int nGender) { m_nGender = nGender; } private: char m_szName[255]; int m_nGender; }; class CStudent:public CPerson { public: CStudent() {} ~CStudent() {} private: int m_nStuID; }; class CTeacher:public CPerson { public: CTeacher() {} ~CTeacher() {} private: int m_TeaID; }; int main() { CStudent stu; stu.SetGender(1); return 0; }
除了组合,更方便的还可以用继承实现。
继承:子类 ---->父类 派生类--->基类
二、继承的可见性
继承的可见性在什么时机做的检查?
是编译器在编译的时候做的限制,但是在程序运行时,可以通过指针去修改访问被限制的变量。
sizeof(CPerson) = 12字节 (3个int型变量)
sizeof(CStudent) = Sizeof(CPerson)+4字节(m_StuID) = 16字节
三、继承中的访问控制
public 继承:父类成员在子类中保持原有访问级别
private 继承:父类成员在子类中变为private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
派生类类成员访问级别设置的原则
如何恰当的使用public,protected和private为成员声明访问级别?
1、需要被外界访问的成员直接设置为public
2、只能在当前类中访问的成员设置为private
3、只能在当前类和子类中访问的成员设置为protected,protected成员的访问权限介于public和private之间。
三、派生类中的函数隐藏
函数隐藏:发生在基类和派生类中,函数完全相同时且基类没有虚函数。
或者函数只是同名,参数列表不同,无论是否有虚函数,都讲发生隐藏。
关于隐藏:在没有虚函数的情况下,发生函数隐藏。在编译的时候进行早期绑定,子类对象转换为父类对象后,用父类对象指针去调用的时候,我们还是调用父类的所在内存。因为子类对象所占内存的前半部分仍然是父类对象的内存。