C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Множественное наследование, Дублируемое (repeated) наследование
Lom
Отправлено: 29.08.2006, 11:04


Ученик-кочегар

Группа: Участник
Сообщений: 13



Ситуация следующего характера:
есть класс TFunc, в нем описаны float A и B.
Есть TAlg — наследник TFunc.
Есть классы TPrm, TTrp, TSmp, которые являются наследниками TAlg.
А еще есть класс TIntegral, который множественно наследует TPrm TTrp, TSmp.
Так вот вопрос:
когда я в процедуре SetVar() (см. ниже) пытаюсь задать значение A, B или n,
то CBuilder пишет, что
[C++ Error] IntegralClasses.cpp(15): E2014 Member is ambiguous: 'TFunc::A' and 'TFunc::A'
Помогите пожалуйста.
CODE

class TFunc {
public:
 int n;
 float A,B;
 TFunc();
~TFunc();
  double IFunc(double x);
// void SetVar(AnsiString A_, AnsiString B_, AnsiString n_);
  float getA() const;
  float getB() const;
  float getN() const;
};
//------------------------------------------------------------------------------
class TAlg:public TFunc{
public:
 TAlg();
 TAlg(float A_, float B_, float n_);
~TAlg();
 virtual float GetR()=0;
};
//------------------------------------------------------------------------------
class TPrm:public TAlg{
 public:
 TPrm();
~TPrm();
 float GetR();
};
//------------------------------------------------------------------------------
class TTrp:public TAlg{
 public:
 TTrp();
~TTrp();
 float GetR();
};
//------------------------------------------------------------------------------
class TSmp:public TAlg{
 public:
 TSmp();
~TSmp();
 float GetR();
};
//------------------------------------------------------------------------------
class TIntegral: public TPrm,
                public TTrp,
                public TSmp{
 public:
 void SetVar(AnsiString A_, AnsiString B_, AnsiString n_);
 float Result(method mtd);
 TIntegral();
~TIntegral();
};


Отредактировано olegenty — 29/08/2006, 14:58
olegenty
Отправлено: 29.08.2006, 14:04


Ветеран

Группа: Модератор
Сообщений: 2412



либо конкретизируй так:
TPrm::A
TTrp::A
TSmp::A
либо подумай о виртуальном наследовании (в этом случае диаграмма наследования будет выглядеть как "сетка", а не как "дерево", и в производном классе TIntegral будет только один "экземпляр" класса TAlg, а конкретизации будет требовать только один метод: GetR())

Вернуться в Вопросы программирования в C++Builder