概念
定义类时,代码中有共性的成员,还有自己的属性,使用继承可以减少重复的代码,
继承的语法
class 子类:继承方式 父类
继承方式有:public,private,protected
公共继承:父类的公有成员到子类也是公有的,父类的保护成员在子类是受保护的
保护继承:父类中共有的权限内容和保护权限内容,在子类都变为保护权限
私有继承:父类中公有和保护权限内容,在子类都变为私有权限
其中,父类的私有成员,子类不管哪种继承方式都无法访问。
继承中的对象模型
父类中所有的非静态成员属性,子类都会继承,私有成员也会继承,只是私有成员被编译器隐藏了。
继承中构造和析构顺序
#include <iostream>
using namespace std;
class Base
{
public:Base(){cout << "父类构造函数" << endl;}~Base(){cout << "父类析构函数" << endl;}
};
class son :public Base
{
public:son(){cout << "子类构造函数" << endl;}~son(){cout << "子类析构函数" << endl;}
};
int main()
{son s;
}
继承中的构造顺序是,先构造父类,再构造子类,析构则相反,因为创建子类对象的时候,会先创建父类对象,然后继承。
继承同名成员的处理方式
当子类和父类出现同名的成员时,如果需要访问子类,可以直接访问,如果需要访问父类,需要加作用域。
#include <iostream>
using namespace std;
class Base
{
public:int m_a;Base(){m_a = 10;}~Base(){}
};
class son :public Base
{
public:int m_a;son(){m_a = 20;}~son(){}
};
int main()
{son s;cout << s.m_a << endl;//20cout << s.Base::m_a << endl;//10
}
继承中同名成员函数的处理方式
思想和同名成员函数处理方式相同,但需要注意的是,子类的同名函数会隐藏父类中所有的同名函数,解决方法就是加作用域。
#include <iostream>
using namespace std;
class Base
{
public:int m_a;Base(){m_a = 10;}void func(){cout << "父类函数的调用" << endl;}~Base(){}
};
class son :public Base
{
public:int m_a;son(){m_a = 20;}void func(){cout << "子类函数的调用" << endl;}~son(){}
};
int main()
{son s;s.func();//直接调用是子类的函数s.Base::func();//加作用域后就是调用父类的函数
}
继承中同名静态成员的处理方式
静态成员变量的特点是:所有对象共享同一份数据,编译阶段就分配内存,类内声明,类外初始化。
静态成员定义的语法:
static int a;
静态成员函数的特点是:只能访问静态成员变量,不能访问非静态成员变量,也是只有一份,所有对象共享一份函数实例。
静态成员和非静态成员出现同名时,处理方式一致,访问子类直接访问,访问父类需要加上作用域,因为静态成员不属于对象上,因此也可以通过类名直接访问,静态成员属性。
静态成员函数处理方式一致,也可以通过类名方式访问,子类也会隐藏父类同名函数,需要访问被隐藏的父类同名函数,需要加上作用域。
静态成员和非静态成员处理方式是一样的,只是静态成员可以通过对象和类名访问。
多继承
语法:
class 子类:继承方式 父类1,继承方式 父类2......
子类中如果有多个同名成员,需要加作用域区分。(实际开发中很少使用)