多继承案例及常见问题

多继承,是希望一个子类可以继承多个父类的资源,使自己的功能更加强大,有一个床类、一个沙发类,我们希望将两个类的功能整合到一起,成为一个“沙发床”的类,即可以睡觉、又可以做。这就是多继承的应用。当然我们说的有一些抽象,下面代码演示了多继承的案例。

#include <iostream>

using namespace std;

class Bed
{
public:
	void sleep()
	{
		cout << "Bed Sleep ~~" << endl;
	}
};

class Sofa
{
public:
	void sit()
	{
		cout << "Sofa sit ~~" << endl;
	}
};

// 继承多个父类
class Derive : public Bed, public Sofa
{
public:
	Derive()
		:Bed(), Sofa() {}
};

int main(int argc, char* argv[])
{
	Derive SofaBed;
	SofaBed.sleep();
	SofaBed.sit();
	return 0;
}

上面代码演示了如何让一个子类继承多个父类并调用父类的公有接口。当然上面简单的例子是最理想化的继承,试想,如果子类继承的两个父类都有一个同名的成员变量或成员函数怎么办呢?如下:

#include <iostream>

using namespace std;

class Bed
{
public:
	void sleep()
	{
		cout << "Bed Sleep ~~" << endl;
	}
protected:
	int data;
};

class Sofa
{
public:
	void sit()
	{
		cout << "Sofa sit ~~" << endl;
	}
protected:
	int data;
};

// 继承多个父类
class Derive : public Bed, public Sofa
{
public:
	Derive()
		:Bed(), Sofa() {}

	void display()
	{
		cout << data << endl;
	}
};

int main(int argc, char* argv[])
{
	Derive SofaBed;
	SofaBed.sleep();
	SofaBed.sit();
	return 0;
}

以上代码编译后,会提示 data 不明确,这也就造成了二义性问题,子类不知道该选择哪一个了。如下图:

2015-05-24_191201

当然,如果在子类自身中声明一个同名的 data 变量,再调用时则不会报错。如下所示:

class Derive : public Bed, public Sofa
{
public:
	Derive()
		:Bed(), Sofa() {}

	void display()
	{
		cout << data << endl;
	}
private:
	int data;
};

但如果我们必须要使用父类的这个 data 成员变量要怎么办呢?这个话题我们在下一篇文章中介绍。

发表评论