多重继承的问题
问题
class wolf
{
public:
void eat()
{
std::cout << "wolf eat" << std::endl;
}
};
class man
{
public:
void eat()
{
std::cout << "man eat" << std::endl;
}
};
class wolf_man:public wolf,public man
{
};
int main()
{
wolf_man peter;
peter.eat()
}
这段代码是运行不起来的,因为eat不明确是哪个类中的,它在wolf_man中是真实存在的,但是访问不到
解决办法
1.使用前加类名::,如peter.wolf::eat();
2.使用using wolf::eat,这句代码写在wolf_man中,可以用来显示指定,注意这里的eat不用加括号
多重继承带来的重复继承问题
class creature
{
public:
int hp;
int mp
};
class wolf :public creature
{
public:
void eat()
{
std::cout << "wolf eat" << std::endl;
}
};
class man :public creature
{
public:
void eat()
{
std::cout << "man eat" << std::endl;
}
};
class wolf_man:public wolf,public man
{
public:
using man::eat;
};
int main()
{
wolf_man peter;
peter.hp
}
这里最后的peter.hp不明确,不知道它是继承于哪个类,wolf里继承了creature的hp,man也继承了creature的hp
wolf_man的内存简图
creature类成员 |
wolf类成员 |
creature类成员 |
man类成员 |
wolf_man类成员 |
解决办法:
1.使用类名::成员名,如peter.wolf::hp
2.使用virtual
class wolf :public virtual creature
class man : public virtual creature
在类的继承时,加上关键字virtual,当检测到类已经有一份的情况下,它就不会再发生继承了,即在wolf_man中只有一份creature的类,这里这样设置后,hp和mp再wolf_man中都是只有一个