首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >多继承案例及常见问题

多继承案例及常见问题

作者头像
我与梦想有个约会
发布2023-10-20 16:43:42
发布2023-10-20 16:43:42
2320
举报
文章被收录于专栏:jiajia_dengjiajia_deng

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

代码语言:javascript
复制
#include 
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;
}

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

代码语言:javascript
复制
#include 
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 不明确,这也就造成了二义性问题,子类不知道该选择哪一个了。如下图:

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

代码语言:javascript
复制
class Derive : public Bed, public Sofa
{
public:
Derive()
:Bed(), Sofa() {}
void display()
{
cout << data << endl;
}
private:
int data;
};

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档