引入:
由自然界的动物繁衍的规律(eg: 动物继承父类的一切属性,由父类派生并增加自己的新特征)我们引入C++语言在类的使用中描述此类问题。
为解决代码重复使用、提升效率,引入继承机制:允许保留原有类的特性的同时,根据需要将类进行扩充或修改。
1.1概念
1. 有一个类派生出另一个新的类时:
- 原始类称为:基类(父类,Base class);
- 派生出的新类:派生类(子类,Derived class)。
2. 子类(派生类)是继承于由父类(基类)所得,可进行扩充、修改,父类(基类)除构造函数、析构函数外一切成员函数、数据成员,自动成为子类(派生类)的成员。
- 扩充:在子类中增加新的数据成员、成员函数;
- 修改:重写由基类继承的成员;
- 子类所继承的成员函数、数据成员,即使子类在继承后什么都没有,依然可根据成员权限访问、使用父类的成员。
1.2继承与派生的关系:
派生类可再次作为基类派生出新的派生类
分为单继承和多重继承两种:
- 单继承:如果一个派生类只有一个直接的基类;
- 多重继承:如果一个派生类的直接基类有两个或两个以上。
2.1派生类的定义:
派生类定义格式:
class 新派生类名 :继承方式 基类类名
{
//新增派生类的数据成员、成员函数
private:
...
protected:
...
public:
...
}
格式说明:
- 三种继承方式(区别其继承后派生类对成员的访问权限):
- public:公有继承使用最多
- protected:保护继承
- private:默认不写时,系统归为私有继承
- 派生类的成员包括:
- 吸收基类成员:派生类继承了基类的除了构造函数和析构函数以外的全部数据成员和函数成员。
- 新增成员:增添新的数据成员和函数成员,体现了派生类与基类的不同和个性,是派生类对基类的发展。
- 对基类成员进行改造,包含两层含义:一是对基类成员的访问控制方式进行改造;二是定义与基类同名的成员,即同名覆盖。
引例:
class A
{
private:
int m_a;
protected:
int m_b;
public:
int m_c;
};
class B:public A
{
//新增成员变量
public:
int d;
}
int main()
{
cout <<"A的大小=" << sizeof(A) <<
",B的大小=" << sizeof(B) << endl;
return 0;
}
"A的大小= 12" "B的大小= 16 "
B派生类继承基类A 的所有成员的基础上新增成员(int d )四个字节
派生类将基类所有的成员全部继承,与基类的访问权限、继承方式无关,仅区别于是否有权限访问。
2.2 继承方式和派生类的访问权限:
派生类的访问权限由两部分因素共同决定:继承方式、基类的成员权限
说明:
- 当原基类成员权限为private时,派生类均无法访问
- 继承方式与基类成员权限,缩小配置权限
- protected 和 private 两种继承方式在当前派生类无区别,在下一次派生后:该子类类内无法访问private继承,可以访问protected 继承。
1.公有继承(public)使用最多:
父类中的private私有无权在子类中访问,protected public 权限不变
父类:
class A
{
public:
void show1()
{
cout << "A::show1(),公有方法" << endl;
}
protected:
void show2()
{
cout << "A::show2(),保护方法" << endl;
}
private:
void show3()
{
cout << "A::show3(),私有方法" << endl;
}
public:
int m_a = 0;
protected:
int m_b = 1;
private:
int m_c = 2;
};
class B :public A
{
public:
void show()
{
show1();//可以,继承下来是public,,可以在类外访问
show2();//可以,继承下来是protected,不可以在类外访问
//show3();//不能访问
cout << m_a << endl;//可以,继承下来是public,可以在类外访问
cout << m_b << endl;//可以,继承下来是protected,不可以在类外访问
//cout << m_c << endl;//不能访问
}
};
int main()
{
B bb;
bb.show1();//public可以在类外访问
//bb.show2();//错误,protected不能在类外访问
bb.m_a = 100;//public可以在类外访问
//bb.m_b = 200;//错误,protected不能在类外访问
bb.show();//public可以在类外访问
return 0;
}
2.保护继承(protected)
父类中私有成员在子类中无权访问,父类中protected、public 变成protected保护权限。
class B :protected A
{
public:
void show()
{
show1();//可以
show2();//可以
//show3();//不能访问
cout << m_a << endl;//可以
cout << m_b << endl;//可以
//cout << m_c << endl;//不能访问
}
};
int main()
{
B bb;
//bb.show1();//错误,protected不能在类外访问
//bb.show2();//错误,protected不能在类外访问
//bb.m_a = 100;错误,protected不能在类外访问
//bb.m_b = 200;//错误,protected不能在类外访问
bb.show();//public可以在类外访问
return 0;
}
3.私有继承(private)
父类中私有成员在子类中无权访问,父类中protected 、public 全部变成私有private权限。
class B :private A
{
public:
void show()
{
show1();//可以
show2();//可以
//show3();//不能访问
cout << m_a << endl;//可以
cout << m_b << endl;//可以
//cout << m_c << endl;//不能访问
}
};
int main()
{
B bb;
//bb.show1();//错误,protected不能在类外访问
//bb.show2();//错误,protected不能在类外访问
//bb.m_a = 100;错误,protected不能在类外访问
//bb.m_b = 200;//错误,protected不能在类外访问
bb.show();//public可以在类外访问
return 0;
}