+ -
当前位置:首页 → 问答吧 → 问大家一个很基本的问题

问大家一个很基本的问题

时间:2011-12-27

来源:互联网

C/C++ code
#ifndef WORKERMI_H_
#define WORKERMI_H_
#include <string>
class Worker
{
private:
    std::string fullname;
    long id;
protected:
    virtual void date()const;
    virtual void get();
public:
    Worker():fullname("no name",),id(0L){}
    Worker(const std::string & s, long n):fullname(s), ld(n){}
    virtual Worker~(){} = 0;
    virtual void set() = 0;
    virtual void show()const = 0;

};

class Waiter:virtual public Worker
{
private:
    int banache;
protected:
    virtual void date()const;
    virtual void get();
public:
    Waiter():Worker(),banache(0){}
    Waiter(const std::string & s, long n, int i):Worker(s,n),banache(0){}
    Waiter(const Worker & s, int n):Worker(s),banache(n){}
    virtual ~Waiter(){}
    virtual void set();
    virtual void show()const;

};
class Singer:virtual public Worker
{
protected:
    enmu {other, alto, contralto, soprano, bass, baritone,tenor};
    enum {vtypes = 7};
    void date()const;
    void get();
private:
    static char *pv[vtypes];
    int voice;
public:
    Singer():Worker(),voice(other){}
    Singer(const std::string & s,long n, int i= other):Worker(s, n),voice(i){}
    Singer(const Worker & s, int i = other):Worker(s),voice(i){}
    void set();
    void show()const
};

class Singerwaiter:public Waiter, public Singer
{
protected:
    void get();
    void date();
public:
    Singerwaiter(){}
    Singerwaiter(const std::string & s, long n, int i,int k)
        :Worker(s,n),Waiter(s,n,i),Singer(s,n,k){}
    Singerwaiter(const Worker & s,int i,int k):Work(s),Waiter(s,n),Singer(s,k){}
    Singerwaiter(const Waiter & s,int k):Worker(s),Waiter(s),Singer(s,k){}
    Singerwaiter(const Singer & s,int i):Worker(s),Waiter(s,i),Singer(s){}
    void set();
    void show()const;
    
};

#endif


这个是一个有关继承的问题:
第一个是这里 Singerwaiter(){} 我可以改成这样不Singerwaiter():Worker(),Waiter(),Singer(){}
第二个是:Worker类是一个纯基类,这条代码:Waiter(const Worker & s, int n):Worker(s),banache(n){}
  是不是要用Worker的复制构造函数然后在把临时对象复制给Waiter的基类部分,这样解释正确不。
第三个:Singerwaiter(const Waiter & s,int k):Worker(s),Waiter(s),Singer(s,k){}这个代码,形参是Waiter的引用,
对于Worker,因为可以隐式向下传递,所以Worker可以用复制构造函数构造Worker的私有数据,
对于Singer(s,k)也可以用Waiter的引用来构造??请高手用教科书式的回答来指点下我,我正在学代码重用这章。有点糊涂了。

作者: zjxzjx54   发布时间: 2011-12-27

第一是可以的,不过编译器自己就会这么做,所以你初步初始化一样的~
第二个可以这么理解,其实理解为Worker参数用来初始化Worker部分更好~
第三个Singer(const Worker & s, int i = other):Worker(s),voice(i){}

作者: dyangrun   发布时间: 2011-12-27

第一是可以的,不过编译器自己就会这么做,所以你初步初始化一样的~
第二个可以这么理解,其实理解为Worker参数用来初始化Worker部分更好~
第三个Singer(const Worker & s, int i = other):Worker(s),voice(i){}

作者: dyangrun   发布时间: 2011-12-27