Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > ссылка на производный класс из базового


Автор: cooper123 24.11.2011, 13:30
Не могу разобраться. Помогите. Поиск тоже затруднен в силу не понимания. 

Есть базовый класс. из него строятся производные классы. потом строится массив производных классов по ссылке на базовый класс. 
Это все надо что бы сканировать массив производных классов и выполнять виртуальную функцию базового класса определенную в производном. 
А вот как вытащить пораметры производного класса из ссылки на базовый не понятно. 

Код


class strategy{
public:
  strategy();
  virtual compute();
  virtual init();
  virtual init_n();
  std::string name,space;
  int time_scale;
};

class  s1 : public strategy{
 public:
   double ps11,ps12;
}

class  s2 : public strategy{
 public:
   double ps21,ps22;
}

strategy *sl[10];

void load_from_xml(){
  ....
  if(xml_name == "s1"){ 
    s1 = new s1();
    s1.ps11 = xml_s1.ps11;
    s1.ps12 = xml_s1.ps12;
    sl[i] = s1
 }
  if(xml_name == "s2"){ 
    s2 = new s1();
    s2.ps21 = xml_s2.ps21;
    s1.ps22 = xml_s1.ps22;
    sl[i] = s2
 }
}

void compute_n(){
   for(i=0;i<size_of_strategy_array;i++){
       ls[i]->compute();
  }

void print_param(){
   for(i=0;i< size_of_strategy_array;i++){
     cout<<" name "<<sl[i]->name;
     if(sl[i]->name == "s1"){
       cout<<" how to print  s1.ps11 ???????"
       cout<<" how to print  s1.ps12 ???????"
     }
     if(sl[i]->name == "s2"){
       cout<<" how to print  s2.ps21 ???????"
       cout<<" how to print  s2.ps22 ???????"
     }
}


 обьеденить стратегии я могу только по базовому классу, насколько я понимаю. но мне  хочется из этого контейнера,
 списка или массива, который определен по ссылке на базовый обьект, иметь еще доступ к спецефическим параметрам 
конкретной реализации производного класса. Хотя бы для того что бы распечатать. Но хочется еще и понять.

Автор: bsa 24.11.2011, 13:49
во-первых, у базового класса должен быть виртуальный деструктор.
во-вторых, чтобы получить доступ к полям производных классов через ссылку на базовый необходимо, чтобы у базового были соответствующие виртуальные методы, переопределенные в производных.

Автор: cooper123 24.11.2011, 13:59
насчет полей понятно. 

а насчет деструктора- почитаю, но пока не увидел каких либо проблемм. а что может быть плохого?


спасибо за ответ. 

Автор: bsa 24.11.2011, 14:14
Цитата(cooper123 @  24.11.2011,  14:59 Найти цитируемый пост)
а что может быть плохого?

утечка ресурсов.

Автор: borisbn 24.11.2011, 15:56
Цитата(cooper123 @  24.11.2011,  13:59 Найти цитируемый пост)
а что может быть плохого?

Код

struct Base {
    Base() {
        cout << "Base()" << endl;
    }
// virtual
    ~Base() {
        cout << "~Base()" << endl;
    }
};

struct Deriv : public Base {
    Deriv() {
        cout << "Deriv()" << endl;
        m_ptr = new int[ 42 ];
    }
    ~Deriv() {
        cout << "~Deriv()" << endl;
        delete [] m_ptr;
    }

    int * m_ptr;
};

Base * base = new Deriv();
delete base;


проверь сам

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)