1.知识点总结:
(1)运行时子类的继承部分指针指向父类地址,父类所有成员都包含在子类中,但由于可见性的设置,只可以看到没有限制的成员。
//继承的可见性在何时做的检查? //是由编译器在编译时刻做的限制,本质上可以在运行时可以通过指针修改 //继承时父类将所有成员赋给了子类,继承部分指针指向父类的内存 //但是由于可见性问题,只能看到没有做限制的成员
从下图&stu指针指向的内存可以看到,子类中包含了父类的内容
(2)如何在运行后修改指针内数据?
//取stu中 m_nszName[255]:&stu取地址,(char*)&stu强制转换为char* //((char*)&stu + 8) m_nszName前有public和protected8字节 //(int*)((char*)&stu + 8)取地址到p int* p = (int*)((char*)&stu + 8); //p指向的内容修改为123; *p = 123;
运行之后可以看到m_nszName[255]的第一个数据被修改为123
(3)指针转换的安全性
//子类指针转换为父类指针(安全),可以说学生都是人 CPerson* pPer = &stu; //父类指针转换为子类指针(不安全),但是不能说人都是学生 //CStudent* pStu =(CStudent*)&per;
2.学习视频地址:从内存角度看继承
3.学习笔记:
#include//面向对象:继承 //继承的可见性在何时做的检查? //是由编译器在编译时刻做的限制,本质上可以在运行时可以通过指针修改 //继承时父类将所有成员赋给了子类,继承部分指针指向父类的内存 //但是由于可见性问题,只能看到没有做限制的成员 class CPerson { public: CPerson() { } ~CPerson() { } int GetGender() { return m_nGender; } void SetGender(int nGender) { m_nGender = nGender; } //父亲公有的都可以访问 public : int m_nPublic; //父亲的家族财产给儿子继承 protected: int m_nProtected; //父亲的私有财产不能给儿子继承 private: char m_nszName[255]; int m_nGender; }; //父类的继承也有三种属性 class CStudent :public CPerson { public: CStudent(){ m_nPublic = 1; m_nProtected = 1;//类域内部可以访问父类的保护成员 } ~CStudent() { } private: int m_nStuID; }; //增加老师管理系统,老师的数据与行为和学生是类似的,但也有学号,老师号的不同 //如果重建一个老师类就会造成冗余,易造成错误 class CTeacher :public CPerson { public: CTeacher() { } ~CTeacher() { } private: int m_nTeaID; }; int main(int argc,char* argv[]) { int nPerSize = sizeof(CPerson); int nStudent = sizeof(CStudent); CPerson per; CStudent stu; //取stu中 m_nszName[255]:&stu取地址,(char*)&stu强制转换为char* //((char*)&stu + 8) m_nszName前有public和protected8字节 //(int*)((char*)&stu + 8)取地址到p int* p = (int*)((char*)&stu + 8); //p指向的内容修改为123; *p = 123; //指针转换的安全性 //子类指针转换为父类指针(安全),可以说学生都是人 CPerson* pPer = &stu; //父类指针转换为子类指针(不安全),但是不能说人都是学生 //CStudent* pStu =(CStudent*)&per; return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)