为了账号安全,请及时绑定邮箱和手机立即绑定

p->eat()访问不到基类的eat吗?

#include <iostream>

#include <stdlib.h>

#include <string>

using namespace std;


/**

 * 定义人类: Person

 */

class Person

{

public:

    Person()

{

cout << "Person" << endl;

}

~Person()

{

cout << "~Person" << endl;

}

void eat()

{

cout << "eat" << endl;

}


};


/**

 * 定义工人类: Worker

 * 虚继承人类

 */

class Worker : public Person

{

public:

Worker(string name)

{

m_strName = name;

cout << "Worker" << endl;

}

~Worker()

{

cout << "~Worker" << endl;

}

void work()

{

cout << m_strName << endl;

cout << "work" << endl;

}

protected:

string m_strName;

};


/**

 * 定义儿童类:Children

 * 虚继承人类

 */

class Children : public Person

{

public:

Children(int age)

{

m_iAge = age;

cout << "Children" << endl;

}

~Children()

{

cout << "~Children" << endl;

}

void play()

{

cout << m_iAge << endl;

cout << "play" << endl;

}

protected:

int m_iAge;

};


/**

 * 定义童工类:ChildLabourer

 * 公有继承工人类和儿童类

 */

class ChildLabourer:public Worker,public Children

{

public:

ChildLabourer(string name, int age):Worker(name),Children(age)

{

cout << "ChildLabourer" << endl;

}


~ChildLabourer()

{

cout << "~ChildLabourer" << endl;

}

};


int main(void)

{

    // 用new关键字实例化童工类对象

ChildLabourer *p = new ChildLabourer("chen",24);

    // 调用童工类对象各方法。

p->eat();//错误??????访问不到?

p->work();

p->play();

delete p;

p = NULL;


system("pause");

return 0;

}


正在回答

2 回答

可以通过p->Person::eat(),来访问基类的eat函数。

0 回复 有任何疑惑可以回复我~

这是因为Worker和Children类中都有从person类继承的eat,ChildLabourer不知道自己调用的是哪个父类的eat函数。要解决这个问题,就要用到虚继承,就是把class Worker : public Person和class Children : public Person改成class Worker : virtual public Person和class Children : virtual public Person。具体你可以看这一章的课程。

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之继承篇
  • 参与学习       75203    人
  • 解答问题       249    个

继承,C++面向对象三大特征之一,通过编码实践方式讲解到操作层面

进入课程

p->eat()访问不到基类的eat吗?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信