游戏开发之C++继承与派生(包含访问控制)(C++基础)

984 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

游戏开发之C++继承与派生(包含访问控制)(C++基础)

1.继承与派生

  • 继承是站在子类的角度上来说的,派生是站在父类的角度来说的。
  • 继承是复用父类的功能,实现代码重用。
  • 1.继承具有传递性;
  • 2.继承不具有对称性;
  • 3.基类是对派生类的抽象,派生类是对基类的具体化。

继承的声明语法: class 派生类名:权限描述符 继承父类1,权限描述符 继承父类2,...{成员列表}

TIPS:父类(基类)名必须是已定义的变量名。

	//基类A
	class A
	{
	public:
		A()
		{
			std::cout << __FUNCTION__ << " " << __LINE__ << std::endl;
		}
		void PrintA()
		{
			std::cout << __FUNCTION__ << " " << __LINE__ << std::endl;
		}
	};

	//派生类B
	//继承声明语法
	class B :public A
	{
	public:
		void PrintB()
		{
			std::cout << __FUNCTION__ << " " << __LINE__ << std::endl;
		}
	};

	int main()
	{
		//调用方式
		B b;
		b.PrintA();
		b.PrintB();
		return 0;
	}

2.访问控制

主要体现在:

  • 派生类成员对基类成员的访问权限。
  • 通过派生类对象对基类成员的访问权限。

2.1 公有继承

公有继承,继承之后对父类的访问权限不变。 派生类内部: ①基类的public和protected成员:访问属性在派生类中保持不变,即在派生类中也是public和protected权限。 ②基类的private成员:不可直接访问,但其仍然从基类被继承到派生类中,需要添加为友元类才可直接访问。 ③派生类的成员函数可以直接访问基类的public和protected成员,但不能直接访问基类的private成员。 派生类对象: 只能访问基类public成员。

2.2 保护继承

保护继承:继承之后对父类的访问权限全部修改为保护级别,私有变量除外。 派生类内部: ①基类的public和protected成员:都已protected身份出现在派生类中。 ②基类的private成员:不可直接访问,但其仍然从基类被继承到派生类中,需要添加为友元类才可直接访问。 ③派生类的成员函数可以直接访问基类的public和protected成员,但不能直接访问基类的private成员。 派生类对象: 通过派生类对象,不可访问从基类继承的任意成员。

2.3 私有继承

私有继承:继承之后类外不允许访问,所有成员修改为私有成员。 派生类内部: ①基类的public和protected成员:都以private身份出现在派生类中。 ②基类的private成员:不能直接访问。 ③派生类的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 派生类对象: 通过派生类对象,不可以访问基类继承的任意成员。

2.4 实例

	class A
	{
	public:
		int a;
	//类外不允许访问,但是继承类可以访问(要求:继承权限必须是公有权限或保护权限)
	protected:
		int b;
	private:
		int c;
	};

	//公有继承,继承之后对父类的访问权限不变。
	class B :public A
	{
	public:
		B()
		{
			a = 1;//公有权限
			b = 2;//保护权限
			//c = 3; 无法访问
		}
	};

	//保护继承,继承之后对父类的访问权限全部修改为保护级别,私有变量除外。
	class C :protected A
	{
	public:
		C()
		{
			a = 1;//保护权限
			b = 2;//保护权限
			//c = 3;无法访问
		}
	};


	//私有继承,继承之后类外不允许访问,所有成员修改为私有成员。
	class D :private A
	{
	public:
		D()
		{
			a = 1;//私有权限
			b = 2;//私有权限
		}
	};

	int main()
	{
		B b;
		//基类的protected和private无法访问,只能访问public权限的成员变量
		b.a = 1;
		//基类的所有成员变量均不可直接访问
		C c;
		//基类的所有成员变量均不能直接访问
		D d;
		//说明基类的private也被继承下来,只是无法直接访问
		sizeof(b);//12
		sizeof(c);//12
		sizeof(d);//12
		return 0;
	}

2.5 总结

  即不管是共有、保护、私有继承,派生类内部依然遵照基类的规则。而派生类对象则会发生改变。 版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:(blog.csdn.net/qq135595696…)