文章目录
一、继承的概念及定义
1.1 继承的概念
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。举个例子,更好地理解什么是继承:
现在有学生、老师、助教三类人。他们有各自的成员变量和成员函数,实现这三个类需要写三份代码,然而是不是显得有点冗余?因为他们之中有相同的功能(红色框)。再看下图:
这样看的话是不是能好一点,就相当于下面三部分继承了上面的,重复的部分写一遍就行了。
1.2 继承的定义
1.2.1 定义格式
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类:
1.2.2 继承关系和访问限定符
1.2.3 继承基类成员访问方式的变化
总结:
- 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它;
- 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的;
- 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public;
- . 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承。
//class Student : public Person
//class Student : protected Person
//class Student : private Person
二、基类和派生类对象赋值转换
- 派生类对象 可以赋值给基类的对象 / 基类的指针 / 基类的引用;基类对象不能赋值给派生类对象。
- 可以使用基类指针或者引用指向派生类的对象,反之则不行
三、继承中的作用域
在继承体系中基类和派生类都有独立的作用域。
同名隐藏:在子类和基类中具有相同名称的成员(成员函数或者成员变量),需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。通过一段代码来展示一下:
// B中的fun和A中的fun不是构成重载,因为不是在同一作用域
// B中的fun和A中的fun构成隐藏,成员函数满足函数名相同就构成隐藏。
class A
{
public:
void fun()
{
cout << "func()" << endl;
}
};
class B : public A
{
public:
void fun(int i)
{
A::func();
cout << "func(int i)->" << i << endl;
}
};
void