游戏开发之C++多继承及虚继承(C++基础)

165 阅读1分钟

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

游戏开发之C++多继承及虚继承(C++基础)

1.多继承的概念

概念:一个类(派生类)同时继承多个父类(基类)。 不推荐使用,因为多继承会带来非常严重的二义性(例如:继承的两个父类有同名的成员函数)。

多继承之菱形继承实例:

	class F
	{
	public:
		int f;
		void PrintF()
		{
			std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
		}
	};

	class A :public F
	{
	public:
		int a;
		void Print()
		{
			f = 1;
			std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
		}
	};

	class B :public F
	{
	public:
		int b;
		void Print()
		{
			f = 2;
			std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
		}
	};
	
	//派生类C继承基类A、B
	class C : public A, public B
	{
	public:
		int c;
	};

	int main()
	{
		C c;
		sizeof(C);//20,A和B类的父类均为F类,F类有两份。
		//c.Print();错误,编译器无法清楚具体调用的是A、B、C三个类中哪个类的Print
		c.A::Print();
		c.B::Print();
		c.A::f = 1;
		c.B::f = 2;
		c.A::PrintF();//1
		c.B::PrintF();//2
		return 0;
	}

2.虚继承

虚继承用于解决菱形继承中公共基类有两份的问题。 虚继承会在每个定义虚继承的类中生成一个虚类指针(可通过sizeof验证)。 当定义为虚继承时,公共基类只有一份。 语法: 语法:类 变量名:virtual 访问权限 父类变量名1,virtual 访问权限 父类变量名2,...{成员列表}

实例:

	class F
	{
	public:
		int f;
		void PrintF()
		{
			std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
		}
	};
	//A类虚继承F类
	class A :virtual public F
	{
	public:
		int a;
		void Print()
		{
			f = 1;
			std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
		}
	};
	//B类虚继承F类
	class B :virtual public F
	{
	public:
		int b;
		void Print()
		{
			f = 2;
			std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f << std::endl;
		}
	};

	class C : public A, public B
	{
	public:
		int c;
	};

	int main()
	{
		//定义虚继承
		C c;
		//4(C类)+8(B类)+8(A类)+4(F类) = 24个字节。
		sizeof(C);//24,A和B类中编译器都添加了一个虚类指针,F类只有一份。
		//由于F类只有一份公共内存,所以f最终的结果是2。
		c.A::f = 1;
		c.B::f = 2;
		c.A::PrintF();//2
		c.B::PrintF();//2
		return 0;
	}

版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:(blog.csdn.net/qq135595696…)