注册 登录
编程论坛 C++教室

我的C++虚基类作业

神vLinux飘飘 发布于 2007-06-03 19:47, 1008 次点击
设计一个基类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成员)
7 回复
#2
神vLinux飘飘2007-06-03 19:50
如果要我重新设计这个题目,我肯定不会 Reader : public Teacher, public Student这样去MI

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

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

这让我感到非常不安。大家认为呢?
#3
aipb20072007-06-03 21:13
神,用不着不安,这正是多继承的好例子。
其实并没有你说的reader处于两种状态,只能说一个reader的对象同时具有了老师和学生的某些属性。
这样的继承是十分安全的,继承中的虚拟机制会很智能的处理不同的对象行为(动态绑定)。
#4
神vLinux飘飘2007-06-04 14:33
Reader在创建的同时,会创建Teacher和Student这两个子对象,怎么能说只是具有了老师和学生的某些属性呢?
#5
wfpb2007-06-04 14:58
lz可以这样试试:
template<class T>
class Reader:public T
{
//...
};

Reader<Teacher>teacher_reader;
就是老师读者...
#6
aipb20072007-06-04 15:02
创建两个子对象,又不是说就是学生和老师的组合体了。

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

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

#7
wfpb2007-06-04 15:27

也可以这样:


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编辑过]

#8
aipb20072007-06-04 19:48
LS的方法很好
不过无论是哪个方法,都要根据判断学生还是老师这点,再根据不同使用不同的方法。
同时就楼主最先那个题目,要设计一个继承体系的话,你这样做也偏离本意了啊。
单就完成这个题目说,我觉得最初那个设计完全没有问题。唯一的感觉不和谐就是“读者”同时创建了“老师”和“学生”两个子对象,这点按实际来说,有点迷惑。

继续关注下!
1