求教一道关于C++继承的题目!
#include<iostream>#include<string>usingnamespacestd;classpeople{public:stringname;peo...
#include <iostream>
#include <string>
using namespace std;
class people
{
public:
string name;
people()
{
cout<<"Please input name:";
cin>>name;
}
};
class chinese:public people
{
public:
string province;
chinese()
{
cout<<"Please input province:";
cin>>province;
}
};
class student:public people
{
public:
string xueli;
student()
{
cout<<"Please input xueli:";
cin>>xueli;
}
};
class chinese_student:public chinese,public student
{
public:
void print()
{
cout<<"name:"<<chinese::name<<endl;
cout<<"province:"<<province<<endl;
cout<<"xueli:"<<xueli<<endl;
}
};
int main()
{
chinese_student cs;
cs.print();
return 0;
}
问题一:chinese_student类既继承了chinese类,又继承了student类,当初始化cs对象时,要输入两次name,而我只想让输入一次,怎么办?
问题二:而且chinese_student的print函数输出name的时候还必须像这样chinese::name指定个域才行,不然就报错。当(子类继承的两个父类)又有公共的父类,那这个父类的成员岂不是要重复了?就像问题一里的情况? 展开
#include <string>
using namespace std;
class people
{
public:
string name;
people()
{
cout<<"Please input name:";
cin>>name;
}
};
class chinese:public people
{
public:
string province;
chinese()
{
cout<<"Please input province:";
cin>>province;
}
};
class student:public people
{
public:
string xueli;
student()
{
cout<<"Please input xueli:";
cin>>xueli;
}
};
class chinese_student:public chinese,public student
{
public:
void print()
{
cout<<"name:"<<chinese::name<<endl;
cout<<"province:"<<province<<endl;
cout<<"xueli:"<<xueli<<endl;
}
};
int main()
{
chinese_student cs;
cs.print();
return 0;
}
问题一:chinese_student类既继承了chinese类,又继承了student类,当初始化cs对象时,要输入两次name,而我只想让输入一次,怎么办?
问题二:而且chinese_student的print函数输出name的时候还必须像这样chinese::name指定个域才行,不然就报错。当(子类继承的两个父类)又有公共的父类,那这个父类的成员岂不是要重复了?就像问题一里的情况? 展开
5个回答
展开全部
修改如下:
#include <iostream>
#include <string>
using namespace std;
class people
{
public:
string name;
people()
{
cout<<"Please input name:"; cin>>name;
}
};
class chinese:public virtual people//用虚基类,因为从你的分类情况看,chinese这个类是从
//国家这种角度来分的,而你下面的student类是从职业角度来分的,这样你的chinese_student
//类就变成有重复的部分了,对于这种情况,就需要用虚基类了。
{
public:
string province;
chinese()
{
cout<<"Please input province:";
cin>>province; }
};
class student:public virtual people//理由同上
{
public:
string xueli;
student()
{ cout<<"Please input xueli:"; cin>>xueli; }
};
class chinese_student:public chinese,public student//这里就直接继承,这样people就只有一份
//版本了
{
public:
void print()
{ cout<<"name:"<<name<<endl; //因为people只有一份版本了,这个就不再需要区分什么
cout<<"province:"<<province<<endl; cout<<"xueli:"<<xueli<<endl; }
};
int main()
{ chinese_student cs; cs.print(); return 0;}
#include <iostream>
#include <string>
using namespace std;
class people
{
public:
string name;
people()
{
cout<<"Please input name:"; cin>>name;
}
};
class chinese:public virtual people//用虚基类,因为从你的分类情况看,chinese这个类是从
//国家这种角度来分的,而你下面的student类是从职业角度来分的,这样你的chinese_student
//类就变成有重复的部分了,对于这种情况,就需要用虚基类了。
{
public:
string province;
chinese()
{
cout<<"Please input province:";
cin>>province; }
};
class student:public virtual people//理由同上
{
public:
string xueli;
student()
{ cout<<"Please input xueli:"; cin>>xueli; }
};
class chinese_student:public chinese,public student//这里就直接继承,这样people就只有一份
//版本了
{
public:
void print()
{ cout<<"name:"<<name<<endl; //因为people只有一份版本了,这个就不再需要区分什么
cout<<"province:"<<province<<endl; cout<<"xueli:"<<xueli<<endl; }
};
int main()
{ chinese_student cs; cs.print(); return 0;}
展开全部
这种问题就是C++的虚继承出现的原因……
不使用虚继承时,当子类继承的两个父类又有公共的父类,那这个子类就会有两组”公共的父类“的成员,而假如chinese和student是虚继承自people的时候,需要在各自的构造函数里面显式调用people的构造函数,但是在chinese_student类里面就可以只保留一组people类的成员……
不使用虚继承时,当子类继承的两个父类又有公共的父类,那这个子类就会有两组”公共的父类“的成员,而假如chinese和student是虚继承自people的时候,需要在各自的构造函数里面显式调用people的构造函数,但是在chinese_student类里面就可以只保留一组people类的成员……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个是虚基类的问题,在c++中为了解决这种问题要用到虚基类,还可以节省内存空间,你最好还是自己看看书,跟你说只是片面的,谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
继承层次有问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不是我不说 是我看不懂啊
我刚学到第三章
我刚学到第三章
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询