一、继承的概念及定义
继承可以使代码复用,允许在保持原有类特性的基础上进行扩展。
举个例子:就好比我现在要封装老师、学生等这些人的属性和方法,但是这些人都有重复的属性和方法,比如name、age、sex等等,那么我可以封装一个人的属性和方法,然后我用老师、学生的类去继承人这个类,他们的类里面都有了共同的属性和共用的方法,不用再去每个类里面分别写了。
继承是类设计层次的复用,之前接触到的复用都是函数复用。
代码解释如下:
我写了一个 Person 的类,然后老师、学生再去继承这个 Person 类,就不用在老师和学生的里面再写相同的属性和方法。
#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
using namespace std;class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}string _name = "person";int _age = 18;
};class student : public Person
{
public:int _student_id;
};class teacher : public Person
{
public:int _job_number;
};int main()
{student s;teacher t;s._name = "赵三";s._age = 19;s._student_id = 01;s.Print();t._name = "张老师";t._age = 25;t._job_number = 0001;t.Print();return 0;
}
上面写的 teacher 和 student 继承了 Person 类,都是用类里面的权限访问限定符中的 public,那么为什么要用 public 继承?
访问限定符的访问方式变化:
类成员/继承方式 | public继承 | protected继承 | private继承 |
基类的public成员 | 派生类的public成员 | 派生类的protected成员 | 派生类的private成员 |
基类的protected成员 | 派生类的protected成员 | 派生类的protected成员 | 派生类的private成员 |
基类的private成员 | 在派生类中不可见 | 在派生类中不可见 | 在派生类中不可见 |
总结:
class 中默认继承方式是 private;struct 中默认继承方式是 public(和类中的默认权限一样)
父类成员在子类的访问方式 = min(成员在基类的访问限定符,继承方式)
public > protected > private
二、基类和派生类对象赋值兼容转换。
1. 子类的对象 可以给 父类的对象/指针/引用。(切片)
2. 基类对象不能赋值给子类对象。
3. 基类的指针/引用可以赋值给子类的指针/引用(需要C++11中强转类型)
#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
using namespace std;class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}string _name = "person";int _age = 18;
};class student : public Person
{
public:int _student_id;
};class teacher : public Person
{
public:int _job_number;
};void func(Person& p)
{p.Print();
}int main()
{student s;teacher t;func(s);func(t);return 0;
}
画图解释一下切片,如下: