у меня есть базовый класс называется 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, но безрезультатно.
Это должно работать:
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);
Где номер процесса является функцией.