1.继承的基本概念
1.类与类之间的关系
- has-A,包含关系,用以描述一个类由多个“部件类”构成,实现has-A关系用类的成员属性表示,即一个类的成员属性是另一个已经定义好的类。
- use-A,一个类使用另一个类,通过类之间的成员函数相互联系,定义友元或者通过传递参数的方式来实现。
- is-A,即继承关系,关系具有传递性。
2.继承的相关概念
万事万物皆有继承这个现象,所谓的继承就是一个类继承了另一个类的属性和方法,这个新的类包含了上一个类的属性和方法,被称为子类或者派生类,被继承的类称为父类或者基类。
3.继承的特点
- 子类拥有父类的一些属性和方法(除了构造函数和析构函数)。
- 子类可以拥有父类没有的属性和方法。
- 子类是一种特殊的父类,可以用子类来代替父类。
- 子类对象可以当做父类对象使用。
2. 继承一共有3种继承方式,适用于不同的场景,依情况而定 。
1.公有继承:访问权限最高;除派生类外,外部函数也可以直接访问(无论是成员变量还是成员函数)。
适用场景:需要被外界访问到时,设置为public。
2. 保护继承:访问权限中等;该类内部函数、派生类都能访问,外部类、外部函数不能访问
适用场景:只能在当前类和子类中访问,设置为protected。
3. 私有继承:访问权限最低;只能是该类内部函数互相调用,派生类、外部函数都不能访问。
适用场景:只能在当前类中访问设置为private。
值的一提的是:
(1)父类中的private成员依然存在于子类中,但是却无法访问到。不论以何种方式继承父类,子类都无法直接使用父类中的private成员。
(2)用public形式,基类除了私有成员的其它所有都被原样的继承到派生类中;即在基类中是public的,在派生类中还是public的,在基类中是protected的,在派生类中还是protected的。
(3)如果采用protected形式,则基类中除了私有成员的其它所有都被以protected的形式继承到派生类protected中。
(4)如果采用private形式,则基类中除了私有成员的其它所有都被以private的形式继承到派生类private中。
举例:
#include<iostream>
using namespace std;
class person{
public:
person()
{
name = "父类初始化" ;
ID = "父类初始化";
age = "父类初始化" ;
cout << "父 类 构 造 函 数" << endl ;
}
~person()
{
cout << " ~父 类 析 构 函 数" << endl ;
}
void eat()
{
name = "父类name" ;
ID = "父类ID";
age = "父类age" ;
cout << "父 类 成 员 函 数" << endl;
}
string ID ; // 公有数据成员
private:
string name ; //私有数据
protected:
string age ; //保护数据成员
};
class worker :public person //公有继承
{
public:
worker()
{
salary = "子类初始化 ";
cout << "子 类 构 造 函 数" << endl ;
}
~worker()
{
cout << " ~子 类 析 构 函 数" << endl ;
}
void work()
{
name = "子类name" ; // 子类都无法直接使用父类中的private成员
ID = "子类ID";
age = "子类age" ;
salary = "子类salary" ;
cout << "子 类 成 员 函 数 " << endl ;
}
void print()
{
cout << "age == " << age << endl ;
cout << "ID == " << ID << endl ;
cout << "salary == "<< salary << endl ;
}
private:
string salary ;
};
int main(void)
{
worker work1 ;
work1.ID = "我在外界设置的ID" ;
work1.age = "我在外界设置的age"; //被继承到了子类的protected 中
work1.print();
cout << "---------------------------------------------------" << endl ;
work1.eat(); //调用父类的public成员函数
work1.print();
cout << "---------------------------------------------------" << endl ;
work1.work() ;//调用子类的public成员函数
work1.print();
cout << "---------------------------------------------------" << endl ;
}