C++ 类的继承
面向对象程序设计的三大特性之一:继承
人类可以封装成一个类,学生是一个类。由于学生也是人类,所以可以继承人类这个类中的方法和属性。
类man称为父类、基类或者超类
类Student称为派生类、子类
UML图:
父类中的所有非静态成员都会被子类继承
class Test1
{
int a;
public:
int b;
protected:
int c;
}
class Test2 : public Test1
{
public:
int e;
}
sizeof(Test2) = 16 //子类继承了父类的所有非静态成员
类成员的访问控制和继承
不写继承方式默认为私有继承
√——可以访问
×——不可以访问
类不想被访问的私有数据声明为private
访问的类 | public | private | protected |
---|---|---|---|
同一个类 | √ | √ | √ |
派生类 | √ | × | √ |
外部的类 | √ | × | × |
派生类定义的成员方法以及参数列表和父类中的定义的方法一致,派生类的定义的方法会覆盖父类中方法。
派生类继承基类所有方法,例外的情况:
- 基类的构造函数、析构函数、拷贝构造函数
- 基类重载运算符
- 基类友元函数
继承类型
一般都是用公有继承,很少使用私有和保护继承
类的成员访问控制权可以有以上三种,故继承也就有三种:
-
公有继承【public】
-
基类公有成员是派生类公有成员
-
基类的保护成员是派生类的保护成员
-
基类的私有成员是派生类的私有成员,派生类不能直接访问,可通过基类公有、保护的方法进行访问。
class man { ... }; class student : public man { ... }
-
-
保护继承【protected】
基类公有成员和保护成员都成为派生类的保护成员,只能通过派生类成员函数访问。
私有成员无法直接访问。class man { ... }; class student : protected man { ... }
-
私有继承【private】
基类公有、保护成员都成为派生类私有成员,只能通过成员函数访问。基类的私有成员派生类无法直接访问。
class man { ... }; class student : private man { ... }
多继承
派生类有多个父类
语法格式:
class [派生类] : [继承方式] [基类1],[继承方式2] [基类]... { [派生类成员] ... }
语法格式:
class [派生类] : [继承方式] [基类1],[继承方式2] [基类]...
{
[派生类成员]
...
}
继承后同名成员的处理方式:
- 子类对象可以直接访问子类同名成员
- 子类对象作用域可以访问到父类同名成员
- 子类和父类拥有同名成员函数,父类中同名成员函数会被隐藏,加作用于可以访问到父类中的同名函数。