1、public、protected、private 指定继承方式
1.基类成员在派生类中的访问权限不得高于继承方式中指定的权限
即继承方式中的public、protected、private是用来指明基类成员在派生类中的最高访问权限。
2.无论继承方式如何,基类中的private成员在派生类中始终不能使用
3.如果让基类的成员既不能通过对象访问,还能在派生类中使用,只能申明为protected。
**虽然基类中的private不能在派生类中使用,实际上,基类的private成员是能被继承的,并且(成员变量)会占用派生类对象的内存,仅仅只是在派生类不可见,导致无法使用。
2、基类、派生类
派生类在继承基类的普通成员函数,类的构造函数不能被继承,因为派生类的名字不同,不能成为派生类的构造函数,也不能成为普通的成员函数,所以需要派生类的构造函数来初始化继承过来的成员变量,但是大部分的基类都有private属性的成员变量,所以,我们有个思路:在派生类的构造函数中调用基类的构造函数,写在初始化列表里
若A-->B-->C 先顺序构造ABC,再逆序析构C-->B-->A
3、用指针来突破类中的权限
#include <iostream>
using namespace std;
class People{
protected:
char *m_name;
int m_age;
public:
People(char *name, int age):m_name(name), m_age(age){}
};
class Student: public People{
private:
float m_score;
public:
Student(char *name, int age, float score):People(name, age), m_score(score){}
void display();
};
void Student::display()
{
cout<<m_name<<" "<<m_age<<" "<<m_score<<endl;
}
int main()
{
Student stu("ming", 25, 96.3f);
stu.display();//普通的只能通过调用成员函数来查看privtae下的数据
Student *s = new Student("li", 24, 82.4f);//指针
s->display();
char *p = *(char**)((char*)s+0);//指针的偏移,下图更好理解
cout << p << endl;
return 0;
}
利用指针,只要了解类中的对象内存布局,通过指针偏移就可以访问
是指针太强大了,也是C语言的一个bug
指针偏移: