0

それ自体と同じ型のオブジェクトへのポインターの配列をメンバーとして含む親クラスがあります。親クラスから派生した別のクラスがあります。派生クラスが独自のオブジェクト (親クラスではない) へのポインターの配列を使用することを望みます。派生クラスは、ポインターの配列に格納されているオブジェクトのメソッドを呼び出します。派生クラスと基本クラスで定義および実装されている両方のメソッドを呼び出します。以下のコードは、親にメンバ z が含まれていない (derived::doX() 内) ため、明らかにコンパイルされません。z にアクセスする前に dyanamic_cast(p[i]).z を実行できましたが、実行時に b のすべてのメソッドでそれを行う必要があります。派生クラスで "p" を非表示にすると (オブジェクトの構築中に p をキャストすることによって)、基本的にポインター p の 2 つの配列が得られますが、すべてのメソッドが同じオブジェクト (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();
}
4

1 に答える 1