了解到c++的面向对象的编程思想以及它的三大特性封装、继承、多态后,本文主要讲述他的继承这一特性。
目录
8、基类中不同访问限定符下的成员以不同继承方式继承后再派生类中的访问限定
1、了解继承
首先看一下的代码,A是被继承的类,B是继承的类;在c++中A被称为父类,B被称为子类。
class A//父类
{
public:
A(int a = 0):ma(a)
{
cout << "A(){}"<<endl;
}
void show(){}
void show(int rhs){}//重载
~A()
{
cout << "~A(){}"<<endl;
}
private:
int ma;
};
class B:public A//子类
{
public:
B(int b = 0):mb(b)
{
cout << "B(){}"<<endl;
}
void show(){}//隐藏
~B()
{
cout << "~B(){}"<<endl;
}
private:
int mb;
};
int main()
{
B b;
return 0;
}
也就是说B类继承了A类,它拥有A类的成员。
2、继承的本质
透过现象看本质,从上述的代码中可以看到,在B类中,他继承了A类,在它的作用域下就会存在A类的成员。本质上可以说是代码的复用。不需要在B类中重复实现和A类相同的成员,继承就可以完成这样的事情。
3、继承的内容
①继承了作用域;
②继承除构造函数以外的所有成员;
4、继承的写法
类标识符class 类名 :继承方式(可省,默认为私有的) 基类名称
5、继承与派生的关系
根据上述代码来描述继承和派生的关系如图:
继承是子类对父类的动作;派生是父类对子类的动作;
6、派生类(子类)的内存布局
B类作为A派生出来的类,它的内存布局如图所示:
7、派生类对象的构造析构
构造:系统调用基类的构造
系统调用派生类的构造
析构:系统调用派生类的析构
系统调用基类的析构
运行上述的代码,结果如下:
8、基类中不同访问限定符下的成员以不同继承方式继承后再派生类中的访问限定
访问限定符:
Public:任意位置访问
Protected:本类与子类类中访问
Private:本类类中访问;
继承方式/访问限定符
| Public | Protected | Private |
Public | Public | Protected | 不可访问 |
Protected | Protected | Protected | 不可访问 |
Private | Private | Private | 不可访问 |
公有继承是是一个的关系,对基类的公有成员和保护成员的访问属性不变,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员;
私有继承是有一个的关系,基类的公有成员和保护成员都被派生类继承下来之后变成私有成员,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。
保护继承中,基类的公有成员和保护成员被派生类继承后变成保护成员,派生类的新增成员可以访问基类的公有成员和保护成员,但是访问不了基类的私有成员。
9、类与类的关系
组合: has_a a part of
继承: is_a a kind of
代理: 容器适配器的实现就是一种代理的关系
10、基类或派生类指针或引用的相互指向或引用
注意:
允许基类的指针或引用指向或引用派生类对象;
不允许派生类的指针或引用指向或引用基类对象;
解释基类指向或引用派生类:
解释派生类指向或引用基类: