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