鱼C论坛

 找回密码
 立即注册
查看: 1960|回复: 4

多继承中不懂得地方

[复制链接]
发表于 2014-7-30 18:22:40 | 显示全部楼层 |阅读模式
1鱼币
#include <iostream>
class Animal      //定义动物类
{
public:
void Eat();
};
class Pig : public Animal   //小猪类
{
public:
void climb();
};
class Dog : public Animal   //小狗类
{
public:
void jiao();
};
class DP : public Dog,public Pig //狗猪类
{
};

void Animal::Eat()
{
std::cout << "我正在吃东西。" << '\n';
}
void Pig::climb()
{
std::cout << "我正在爬树。" << '\n';
}
void Dog::jiao()     //叫
{
std::cout << "wang wang\n";
}

int main()
{
DP p;
p.climb();
p.jiao();
p.Eat();     //没注释会出错 注释了就不会了  为什么调用会出错
return 0;
}

最佳答案

查看完整内容

这个其实是钻石继承的问题 要解决只要采取虚拟继承 class Pig : virtual public Anima { }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-30 18:55:41 | 显示全部楼层
vc6的提示
'DP::Eat' is ambiguous
could be the 'Eat' in base 'Dog' of class 'DP'
or the 'Eat' in base 'Pig' of class 'DP'
就是说DP类中的Eat是不可以分辨出是继承自Pig还是Dog
因为这两个类中的Eat都是继承自Animal
你可以试想下如果Pig类和Dog类都重写了Eat 参数都一样
只是干的事情都不一样 那实际运行起来时DP对象中的Eat到底是要显示哪一个呢

多重继承中两个或多个父类中的函数不能相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-30 18:22:41 | 显示全部楼层
这个其实是钻石继承的问题 要解决只要采取虚拟继承
class Pig : virtual public Anima
{

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-30 19:17:11 | 显示全部楼层
优雅的独行者 发表于 2014-7-30 18:55
vc6的提示
'DP::Eat' is ambiguous
could be the 'Eat' in base 'Dog' of class 'DP'

那如何解决?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-31 11:41:12 | 显示全部楼层
优雅的独行者 发表于 2014-7-30 22:07
这个其实是钻石继承的问题 要解决只要采取虚拟继承
class Pig : virtual public Anima
{

2个子类都加上virtual 果然行了 谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表