(2)子类继承所有父类的成员,但子类是否能访问父类成员需看父类成员关键字。
(3)继承又称为拓展,子类的指针可以安全的赋给父类的指针。而父类的指针不能直接赋给子类指针(可以使用强制转换[非安全转换,可能成功可能失败],将父类指针赋给子类指针)(4)继承分为public、protected、private三种,对子类成员可见性产生影响。
(5)实例化子类,先调用父类构造函数,再调用子类构造函数进行初始化,析构时,先调用子类的析构函数再调用父类的析构函数。(6)子类可以对父类函数做可见性覆盖[重写](父类、子类有同名的函数)--->实际两个函数都存在
关于第3点 基类和派生类的转换: A): (父类)CA *pa=NULL; (子类)CB *pb=NULL;
pa=new CB;
指针:代表地址。 指针所指区域的大小由指针的数据类型而决定。 将父类指针pa指向子类CB的对象,则pa指针会 指向子类对象的地址,而指针所指的区域大小只有 父类的大小。(如图1) pa=new CA;//只开辟了CA大小的空间 pb=(CB*)pa;//强制类型转换后,利用pb访问 子类成员会越界。 直接将子类指针指向父类对象,子类指针指向 的区域大小比父类对象本身的大小要大。(如图2)
B):派生类对象可以向基类对象赋值,在赋值时舍弃派生类自己的成员。 C):派生类对象可以替代基类对象向基类对象的引用进行赋值或者初始化。 D):如果函数的参数是基类对象或基类对象的引用,相应的实参可以用派生类(子类)对象。
说明:
1、派上类对象只能访问基类的public成员和protect成员。 基类的私有成员对派生类来说是不可访问的(不能被派生类的成员函数访问),派生类只能通过调用基类的公用成员函数来引用基类的私有数据成员。
2、保护基类的所有成员在派生类中都被保护起来,类外不能访问,其公有成员和保护成员可以被其派生类的成员函数访问。
3、在派生类中,成员有4种不同的访问属性: ① 公有的,派生类内和派生类外都可以访问。 ② 受保护的,派生类内可以访问,派生类外不能访问,其下一层的派生类可以访问。 ③ 私有的,派生类内可以访问,派生类外不能访问。 ④ 不可访问的,派生类内和派生类外都不能访问。