0

我有一个名为Number. 类OneTwo派生自Number. 现在我定义了另一个类Three,我需要从多重继承中访问各个基类:


class Number{
  protected:
     int val;
  public:
    Number(){
        val=0;
    }
    void Add(Number n){//Receives another Number class instance and add the value
        val+=n.val;
    }
};

//class One derived from Number
class One:public Number{
  public:
     One(){
          cal=1;
     }
};

//class two derived from Number
class Two:public Number{
  public:
     Two(){
          val=2;
     }
};

class Three:public One,public Two{
  public:
     Three(){
          Two::Add(One);//--How can i pass instance of class One Here
     }
};

我尝试了 One::Number 和 Two::Number,但没有用。

4

4 回答 4

0

有一些问题,首先val是私有的,因此需要解决protected。接下来你有一颗死亡钻石,所以你需要virtual publicforOneTwo。您还尝试Add使用 a进行调用,type但您需要instance每个类的 a:

class Number{
protected:
     int val;
public:
    Number(){
        val=0;
    }
    void Add(Number& n){//Receives another Number class instance and add the value
        val+=n.val;
    }
};

//class One derived from Number
class One:virtual public Number{
public:
     One(){
          val=1;
    }
};

//class two derived from Number
class Two:virtual public Number{
public:
     Two(){
          val=2;
     }
};

class Three: public  One,  public  Two{
public:
     Three()
     {
           Two t1 ;
           Add(t1 );//--How can i pass instance of class Two Here
     }
};

可以说使用protected数据是不好的,但这取决于您的情况,但要完整,保留数据成员并使用 aval也是一种选择,看起来像这样:privateprotected constructor

class Number{
private:
     int val;
protected:
   Number( int n ) : val(n) {} 
public:
    Number(){
        val=0;
    }
    void Add(Number& n){//Receives another Number class instance and add the value
        val+=n.val;
    }
};

class One: virtual public Number{
public:
     One() : Number( 1 ) {

     }
};

class Two: virtual public Number{
public:
     Two() : Number(2) {
     }
};  
于 2013-04-02T13:18:51.440 回答
-1

您需要创建相应类型的对象。

class Three : public One, public Two
{
public:
     Three()
     {
          Add(One());
          Add(Two());
     }
};

但我不明白你为什么在这里需要 MI。从 Number 继承就足够了。

于 2013-04-02T13:12:08.387 回答
-1

这应该有效:

Two::Add(*(One*)this);
于 2013-04-02T13:22:23.293 回答
-1

问题不仅仅是语法。但是你到底想做什么?

你可以。但是声明的实例在哪里One?你必须先声明它。记住Two::Add(One);不是声明,而是调用语句。

你在做什么相当于让我们说

process_number(One);

其中进程号是一个函数。

于 2013-04-02T13:23:18.817 回答