Доступ к отдельным классам производного класса, производного от двух одинаковых базовых классов

У меня есть базовый класс под названием Number, Учебный класс One а также Two получены из 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 ответа

Решение

Это должно работать:

Two::Add(*(One*)this);

Есть несколько проблем, во-первых val является частным и так, что должно быть сделано protected, Далее у вас есть алмаз смерти, поэтому вам нужно virtual public за One а также Two, Вы также пытаетесь позвонить Add используя type но тебе нужен instance каждого класса:

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 данные плохие, но это зависит от вашего случая, но, чтобы быть полным, это также выбор, чтобы сохранить val private член данных и использовать protected 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) {
     }
};  

Вам нужно создавать объекты соответствующих типов.

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

Но я не понимаю, зачем вам здесь МИ. Наследование от числа будет достаточно.

Проблема не только в синтаксисе. Но что именно вы пытаетесь сделать?

Вы можете. Но где пример One объявили? Вы должны объявить это первым. Помните Two::Add(One); это не декларация, а оператор вызова.

То, что вы делаете, эквивалентно, скажем,

process_number(One);

Где номер процесса является функцией.

Другие вопросы по тегам