C ++ самоссылающийся объект и наследование

У меня есть родительский класс, который в качестве члена содержит массив указателей на объекты того же типа, что и он сам. У меня есть другой класс, который происходит от родительского класса. Я хочу, чтобы производный класс использовал массив указателей на свои собственные объекты (не родительский класс). Производный класс вызывает методы для тех объектов, которые хранятся в массиве указателей; он вызывает оба метода, которые определены и реализованы в производном классе, а также в базовом классе. Код ниже, очевидно, не компилируется, так как parent не содержит члена z (в производной :: doX ()). Я мог бы dyanamic_cast (p [i]). Z прежде, чем получить доступ к z, но я должен был бы сделать это КАЖДЫМ методом в b во время выполнения.
Если я скрываю «p» в производном классе (путем приведения p во время создания объекта), я, по сути, получаю два массива указателей p, однако я хочу, чтобы все методы работали с одними и теми же объектами (находящимися в p). Я пробовал шаблоны, но столкнулся с рекурсивной проблемой. Есть идеи, как это решить?

#include <iostream>
#include <stdlib.h>
using namespace std;

class parent{
protected:
parent** p;
int num;
int x;
public:
parent(int _num, parent** _ps);
virtual void doX();
virtual void print();
};

class derived : public parent {
protected:
//derived** p;
int z;
public:
derived(int _num, parent** _ps) : parent(_num, _ps){};
virtual void doX();
virtual void print();
};

void parent::doX(){
for(int i=0;i<num;i++){
p[i]->x = 1;
}
}
void parent::print(){  cout << "x " << x << endl;
}

parent::parent(int _num, parent** _ds){
num=_num;
p = _ds;
}

void derived::doX(){
for(int i=0;i<num;i++){
p[i]->z = 2;
}
parent::doX();
}
void derived::print(){
cout << "x " << x << endl;
cout << "z " << z << endl;
}

int main(){
const int NUM = 2;
parent** ps = (parent**)malloc(sizeof(parent)*NUM);
for(int i=0; i< NUM; i++){
ps[i] = new derived(NUM, ps);
}

ps[0]->doX();
ps[0]->print();
ps[0]->print();
}

0

Решение

Ты на правильном пути! Вы должны использовать «p», определенный в родительском классе. В методах установки производного класса вы обязуетесь использовать производный тип (в качестве типа параметра). Например, ваш конструктор для определенных будет:

derived(int _num, derived** _ps) : parent(_num, _ps){};

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]