一、继承的概念及定义
继承可以使代码复用,允许在保持原有类特性的基础上进行扩展。
举个例子:就好比我现在要封装老师、学生等这些人的属性和方法,但是这些人都有重复的属性和方法,比如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;
}
画图解释一下切片,如下: