标题:我的C++虚基类作业
只看楼主
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
 问题点数:0 回复次数:7 
我的C++虚基类作业
设计一个基类people,然后派生出student类和teacher类。在图书馆管理系统中,reader(读者)既可以是老师,也可以是学生。请根据虚基类的知识设计people类,student类。teacher类和reader类。(student和teacher借书的时间长度不同)。以下是各类的成员:

People:name,age,setname(),setage(),getname(),getage()
student:id,setid(),getId()
teacher:id,setid(),getId()
Reader:month,tag,setMonth(),getMonth,setTag(),getTag(),showAll()
(注意:所有的数据成员都是Protected类型,方法为Public成员)
搜索更多相关主题的帖子: 基类 作业 
2007-06-03 19:47
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
如果要我重新设计这个题目,我肯定不会 Reader : public Teacher, public Student这样去MI

这句让我十分疑惑:reader(读者)既可以是老师,也可以是学生。

读者只能是老师或者学生,两个状态只能是一种。但是如果按照MI这样去继承,那么Reader就可以同时处于两者状态了,就是说,读者可以同时扮演老师和学生两种角色。

这让我感到非常不安。大家认为呢?

淘宝杜琨
2007-06-03 19:50
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
神,用不着不安,这正是多继承的好例子。
其实并没有你说的reader处于两种状态,只能说一个reader的对象同时具有了老师和学生的某些属性。
这样的继承是十分安全的,继承中的虚拟机制会很智能的处理不同的对象行为(动态绑定)。

Fight  to win  or  die...
2007-06-03 21:13
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
Reader在创建的同时,会创建Teacher和Student这两个子对象,怎么能说只是具有了老师和学生的某些属性呢?

淘宝杜琨
2007-06-04 14:33
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
lz可以这样试试:
template<class T>
class Reader:public T
{
//...
};

Reader<Teacher>teacher_reader;
就是老师读者...

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-04 14:58
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
创建两个子对象,又不是说就是学生和老师的组合体了。

我觉得你理解的是现实层面,我说的是抽象层面。语言的东西,只能这样想了。
非要你这样认为的话,大部分多继承都存在这个矛盾。

你说的也对,怎么说既是老师又是学生呢?呵呵。
但是如果放在一个具体的环境下去实例化,就程序而言我觉得不存在安全问题。


Fight  to win  or  die...
2007-06-04 15:02
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

也可以这样:


class People
{
protected:
string name;
int age;
public:
virtual void setname(string n)
{
name=n;
}
virtual void setage(int a)
{
age=a;
}
virtual string getname()
{
return name;
}
virtual int getage()
{
return age;
}
};
class EduPerson:public People
{
protected:
int id;
public:
virtual void setid(int i)=0;
virtual int getid()=0;
};
class Student:public EduPerson
{
public:
virtual void setid(int i)
{
id=i;
}
virtual int getid()
{
return id;
}
};

class Teacher:public EduPerson
{
public:
virtual void setid(int i)
{
id=i;
}
virtual int getid()
{
return id;
}
};

class Reader
{
int month,tag;
EduPerson* pReader;
bool m_bStu;
public:
Reader(bool bstu=true)
{
m_bStu=bstu;
if(bstu)
pReader=new Student;
else
pReader=new Teacher;
}
~Reader()
{
delete pReader;
}
void setid(int i)
{
pReader->setid(i);
}
int getid()
{
return pReader->getid();
}
void setMonth(int m)
{
month=m;
}
int getMonth()
{
return month;
}
void setTag(int t)
{
tag=t;
}
int getTag()
{
return tag;
}
void showAll()
{
printf(\"%s---,Month:%d,Tag:%d\n\",m_bStu?\"Students\":\"Teacher\",month,tag);
}
};
void DevideTest()
{
Reader tr;
tr.setid(3);
tr.setMonth(2);
tr.setTag(1);
tr.showAll();
}
void main()
{
DevideTest();
}

[此贴子已经被作者于2007-6-4 15:28:06编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-04 15:27
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
LS的方法很好
不过无论是哪个方法,都要根据判断学生还是老师这点,再根据不同使用不同的方法。
同时就楼主最先那个题目,要设计一个继承体系的话,你这样做也偏离本意了啊。
单就完成这个题目说,我觉得最初那个设计完全没有问题。唯一的感觉不和谐就是“读者”同时创建了“老师”和“学生”两个子对象,这点按实际来说,有点迷惑。

继续关注下!

Fight  to win  or  die...
2007-06-04 19:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-144578-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016756 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved