一、类的继承
1、共性与特性
表达不同的类型事物之间共有的属性和行为
个性用于刻画每种事物特有的属性和行为
2、共性表示为父类(基类),个性表示为子类(派生类)
子类继承自父类
基类派生出子类
二、继承的基本语法
1、继承表
一个子类可以同时继承零到多个父类,每个父类的继承方式可以相同也可以不同
class 子类:继承方式1 父类1,继承方式2 父类2,。。。
{
}
2、继承方式
public 公有继承:父类的特性可以通过子类向外扩展
private 私有继承:父类的特性只能为子类所有
protected 保护继承:父类的特性只能在继承链内扩展
三、继承的基本特点
1、公共特点(所有继承都有的特点)
子类对象可以当作父对象使用,子类对象与父类对象没有本质上的区别
子类的逻辑空间小于父类,但它的物理空间要大于等于父类
子类对象 IS A 父类对象
Has A
2、向上和向下转换(造型)
从子类到父类:子类的指针或引用可以隐式转换成父类的指针或引用,这是一种缩小类型的转换,对于编译器来说是安全的(父类的指针指向子类对象,是安全) B b; A& a=b; (A是父类,B是子类) A* a=&b;
从父类到子类:父类的指针或引用不可以转换成子类的指针或引用,这是一种扩大类型的转换,在编译器看来是危险的(子类的指针指向父类的对象,不安全)error:B* p=a;
编译器仅仅是检查指针或引用的数据类型,而对实际引用的目标对象不关心(构成多态的基础)
类型一致:父类的指针或引用实际的目标类型是否需要转换成实际的指针或引用由程序员自己决定
3、子类会继承父类的所有成员(公开、私有、保护)
4、子类会隐藏父类的同名成员(变量、函数) 当子类的成员与父类中的成员名字相同时,无法访问父类的成员
1、父类::隐藏成员 子类可以通过域限定符访问父类隐藏成员 b.A::show();
2、可以使用指针的指针或引用来指向子类对象,然后访问父类中的隐藏成员 将子类隐式转换成父类,这个父类就可以访问父类的成员
5、虽然子类继承所有父类中的成员,但不能访问父类中的私有成员
受保护的成员可以在子类中访问,不能在main函数中访问
测试过程:
#include<iostream>
using namespace std;
class A
{
private :
int a;
public:
int b;
A(void)
{
a=1;
b=2;
c=3;
cout<<"A的构造函数"<<endl;
}
void show(void)
{
cout<<a<<" "<<b<<" "<<c<<endl;
}
protected :
int c;
};
class B:public A
{
public:
int b;
B(void)
{
b=40;
cout<<"B的构造函数"<<endl;
}
void show(void)
{
//cout<<b<<endl;
cout<<A::b<<endl;
}
};
int main()
{
B b;
//A* a=&b;
//a->show();
//cout<<b.b<<endl;
b.show();
//B->show();
}