继承相关知识

概念

定义类时,代码中有共性的成员,还有自己的属性,使用继承可以减少重复的代码,

继承的语法

class 子类:继承方式 父类

继承方式有:public,private,protected

公共继承:父类的公有成员到子类也是公有的,父类的保护成员在子类是受保护的

保护继承:父类中共有的权限内容和保护权限内容,在子类都变为保护权限

私有继承:父类中公有和保护权限内容,在子类都变为私有权限

其中,父类的私有成员,子类不管哪种继承方式都无法访问。

继承中的对象模型

父类中所有的非静态成员属性,子类都会继承,私有成员也会继承,只是私有成员被编译器隐藏了。

继承中构造和析构顺序

#include 
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;
}

继承相关知识_第1张图片

继承中的构造顺序是,先构造父类,再构造子类,析构则相反,因为创建子类对象的时候,会先创建父类对象,然后继承。

继承同名成员的处理方式

当子类和父类出现同名的成员时,如果需要访问子类,可以直接访问,如果需要访问父类,需要加作用域。

#include 
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;//20
    cout << s.Base::m_a << endl;//10
}

继承中同名成员函数的处理方式

思想和同名成员函数处理方式相同,但需要注意的是,子类的同名函数会隐藏父类中所有的同名函数,解决方法就是加作用域。

#include 
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......

子类中如果有多个同名成员,需要加作用域区分。(实际开发中很少使用)

你可能感兴趣的:(java,开发语言,c++)