5、C++中的继承

1、不同的继承方式权限

1、继承方式:

  • 1、public:共有继承
  • 2、protected:保护继承
  • 3、private:私有继承

2、不同继承方式的规律:

  • 1、不同的继承方式不会影响子类对父类的访问权限
  • 2、不同的继承方式,只会影响到内外的访问权限(内外只能访问:基类中的《共有继承》的《共有成员》)
  • 3、子类会继承父类的非私有成员,但并不会直接继承私有成员。

在这里插入图片描述
继承方式总结:

  • 1、假设用户向访问基类的共有成员,就采用《共有继承》
  • 2、假设在多级继承中想要子类的子类去访问,基类的保护成员或者共有成员,就使用《保护继承》
  • 3、假设在多级继承中,不想子类的子类访问基类的数据成员,则使用《私有继承》
    在这里插入图片描述
    在日常开发中,一般都采用公有继承,因为访问权限最高!!!

2、类中的隐藏问题

隐藏:

  • 1、在继承中,如果子类与父类出现同名函数,则子类会把父类的功能函数给隐藏
  • 2、假设想在子类中使用父类的被隐藏的接口,使用域操作符指定父类的接口
	a.base::show();
  • 3、派生类中,只要编写了一个与父类同名的函数,就会把父类的方法给隐藏(不支持重载)
  • 4、通过父类引用派生类,也可以调用父类的方法
#include <iostream>
using namespace std;

class base
{
    
    
    public:
        void show()
        {
    
    
            cout << "show base" << endl;
        }
};

class new_base : public base
{
    
    
    public:
        void show()
        {
    
    
            cout << "show new_base" << endl;
        }
};

int main()
{
    
    
    new_base a;
    //调用父类的 show 方法 ,无效的调用。因为父类的方法已经被隐藏了
    a.show();
    //利用域操作符 ,声明是用父类的方法
    a.base::show();
}

3、类中的多继承

一个派生类可以继承多个基类,获取多个基类的功能接口和数据成员,提高代码的复用性。

语法:

class 派生类 : 继承方式 基类1, 继承方式 基类2

........
{
    
    

}
例子:
class base : public base1, public base2
构造函数的执行顺序: base1 -> base2 -> base
析构函数的执行顺序: base -> base2 -> base1

多继承的参数列表初始化:

class base_a
{
    
    
	public:
	base_a(int a):a(a){
    
    }
	int a;
};

class base_b
{
    
    
	public:
	base_b(int b):b(b){
    
    }
	int b;
};

class base_all : public base_a, public base_b
{
    
    
	public :
		base_all(int a, int b, int c) : base_a(a), base_b(b), c(c)
		{
    
    
		}
	int c;
	
	void show()
	{
    
    
		cout << a << endl;
		cout << b << endl;
		cout << c << endl;
	}
};

4、类中多级继承

语法:

class 基类名
class 派生类 :继承方式 基类名
class 派派生类 : 继承方式 派生类

例子:
class base
class base_a :public base
class base_b :public base_a

构造函数的执行顺序: base  -> base_a ->base_b
析构函数的执行顺序: base_b -> base_a ->base

多级继承的参数列表初始化:

在这里插入图片描述
两种继承方式的框架图:

在这里插入图片描述
在这里插入图片描述

五、菱形继承

在这里插入图片描述

菱形继承会出现一个二义性问题,导致派生类无法调用基类的所有功能函数

菱形继承的二义性解决方式:

  • 1、利用域操作符,指定使用哪一个基类中的函数方法
	a.base_a::show();
	a.base_b::show();
  • 2、利用基类引用派生类,再调用出现二义性的方法
	base_a &q=a;
	base_b &q=a;
  • 3、在派生类中重写出现二义性的方法,把之前的隐藏掉。

  • 4、最强的处理方法:利用虚继承,让base的空间存放在虚表中,不构造两次

base:
base_a :virtual public base //->base_a 虚继承base , 系统就会把 base 放到虚表中
base_b :virtual public base //->base_b虚继承base , base_b 发现虚表已经存在base了就直接使用不再分配。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_53402930/article/details/132405326
今日推荐