【问题标题】:C++ self referencing object and inheritanceC++ 自引用对象和继承
【发布时间】:2013-04-23 00:33:09
【问题描述】:

我有一个父类,它作为一个成员包含一个指向与其自身类型相同的对象的指针数组。我有另一个派生自父类的类。我希望派生类使用指向它自己的对象(而不是父类)的指针数组。派生类调用存储在指针数组中的那些对象的方法;它调用在派生类和基类中定义和实现的方法。下面的代码显然不能编译为父级不包含成员 z(在 derived::doX() 中)。我可以在访问 z 之前进行 dyanamic_cast(p[i]).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();
}

【问题讨论】:

  • parent** ps = (parent**)malloc(sizeof(parent*)*NUM);
  • 更重要的是,不要使用 malloc...只要有一个像这样的成员 static std::vector p;
  • 记住 C++ 不是垃圾收集语言...每个 malloc 都必须有一个 free,每个 new 都必须是一个 delete

标签: c++ inheritance self-reference


【解决方案1】:

你在正确的轨道上!您应该使用父类中定义的“p”。在派生类 setter 方法中,您强制必须使用派生类型(作为参数类型)。例如,您定义的构造函数将是:

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

然后,当您在派生方法中使用 p 时,您知道 p 确实是一个派生类型,并且您可以安全地转换它。

【讨论】:

  • 是的,但是我在每个方法中都有一个强制转换(原则上这是不必要的),它会引入开销并且代码对性能非常关键。到处都有dynamic_casts也不是很好
  • 您可以安全地进行转换 - 使用 C 样式转换。你已经保证它是一个有效的演员表,你不需要 dynamic_cast 的开销
  • 这么说,您可能需要重新考虑您的设计。考虑查看一些设计模式,例如复合模式。 en.wikipedia.org/wiki/Composite_pattern
  • 我使用了 C++ static_cast(),它工作得很好,比 C 风格更简洁
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多