爆破2014 发表于 2014-7-30 18:22:40

多继承中不懂得地方

#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;
}

优雅的独行者 发表于 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到底是要显示哪一个呢

多重继承中两个或多个父类中的函数不能相同

优雅的独行者 发表于 2014-7-30 18:22:41

这个其实是钻石继承的问题 要解决只要采取虚拟继承
class Pig : virtual public Anima
{

}

爆破2014 发表于 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'


那如何解决?

爆破2014 发表于 2014-7-31 11:41:12

优雅的独行者 发表于 2014-7-30 22:07
这个其实是钻石继承的问题 要解决只要采取虚拟继承
class Pig : virtual public Anima
{


2个子类都加上virtual 果然行了 谢了
页: [1]
查看完整版本: 多继承中不懂得地方