类的继承与派生
一.类的继承与派生介绍
类的继承:保持已有类的特性而构造新类的过程。
类的派生:在已有类的基础上新增自己的特性而产生新类的过程。
被继承的已有类称为基类。
派生出的新类称为派生类。
直接参与派生出某类的基类称为直接基类。
基类的基类甚至更高层的基类称为间接基类。
继承的目的:实现设计与代码的重复利用。
派生的目的:当新的问题出现时,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。
二.派生类的定义
1.单继承
一个派生类只有一个直接基类的情况。
例:
{
public:
Rectangle();
~Rectangle();
};
2.多继承
一个派生类同时拥有多个直接基类的情况。
例:
class Derived : public Base1, private Base2
{
public:
Derived();
~Derived();
};
继承方式
public(公有继承) 基类中的公有成员和保护成员都以公有成员身份出现在派生类中,而基类中的私有成员在派生类中不可直接访问。
protected(保护继承) 基类中的公有成员和保护成员都以保护成员身份出现在派生类中,而基类中的私有成员在派生类中不可直接访问。
private(私有继承)基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类中的私有成员在派生类中不可直接访问。
例:
#include <iostream>
using namespace std;
class A
{
private://私有成员
int a;
protected://保护成员
int b;
public://公有成员
int c;
A()//构造函数
{
a = 0;
b = 0;
c = 0;
}
void setA(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}
void print()
{
cout << "a = " << a << " b = " << b << " c = " << c << endl;
}
};
class B : public A//公有继承
{
public:
void print()
{
//cout<<"a = "<<a; //基类的私有成员不可直接访问
cout <<"b = " << b << " c = " << c << endl;
}
};
class C : protected A//保护继承
{
public:
void print()
{
//cout<<"a = "<<a; //基类的私有成员不可直接访问
cout << "b = " << b << " c = " << c << endl;
}
};
class D : private A//私有继承
{
public:
void print()
{
//cout<<"a = "<<a; //基类的私有成员不可直接访问
cout << "b = " << b << " c = " << c << endl;
}
};
int main()
{
A aa;
B bb;
C cc;
D dd;
aa.c = 100;
bb.c = 100;
//cc.c = 100; //在类的外部,保护继承将基类所有成员视为私有成员,不可访问
//dd.c = 100; //私有继承,基类中所有成员视为私有成员,不可访问
aa.setA(1, 2, 3);
bb.setA(10, 20, 30);
//cc.set(40, 50, 60); //在类的外部,保护继承将基类所有成员视为私有成员,不可访问
//dd.set(70, 80, 90); //私有继承,基类中所有成员视为私有成员,不可访问
aa.print();
bb.print();
cc.print();
dd.print();
return 0;
}
运行结果

注意:
公有继承
基类的公有成员,派生类可以继承为自己的公有成员。在派生类可以访问,在外部也可以访问。
基类的保护成员,派生类可以继承为自己的保护成员,在派生类可以访问,在外部不可以访问。
基类的私有成员,派生类不可以访问基类的私有成员 。
私有继承
基类的公有成员,派生类中继承为自己的私有成员,不可直接访问。
基类的保护成员,派生类中继承为自己的私有成员,不可直接访问。
基类的私有成员,派生类不可以访问基类的私有成员。
保护继承
基类的公有成员,派生类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问。
基类的保护成员,派生类中继承为自己的保护成员,在派生类可以访问,在外部不可以访问。
基类的私有成员,派生类不可以访问基类的私有成员。
三.派生类的生成过程
1.吸收基类成员
吸收基类成员之后,派生类实际上就是包含了它的全部基类中除构造和析构函数之外的所有成员。
2.改造基类成员
如果派生类声明了一个和某基类成员同名的新成员,派生的新成员就隐藏或覆盖了外层的同名成员。
3.添加新的成员
派生类增加新成员使派生类在功能上有所发展。