2013-04-23 101 views
0

我有一个父类,它作为成员包含指向与自身类型相同的对象的指针数组。我有另一个派生自父类的类。我希望派生类使用指向它自己的对象(不是父类)的指针数组。派生类调用存储在指针数组中的那些对象的方法;它调用在派生类和基类中定义和实现的两个方法。下面的代码显然不能编译,因为parent不包含成员z(在derived :: doX()中)。在访问z之前,我可以使用dyanamic_cast(p [i])。但是在运行时,我必须在b中的每个方法上都这样做。 如果我在派生类中隐藏“p”(通过在对象构造过程中强制转换p),我基本上得到了两个指针p数组,但是,我希望所有方法对同一个对象(驻留在p中)进行操作。我尝试过模板,但遇到了递归问题。任何想法如何解决这个问题?C++自引用对象和继承

#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(); 
} 
+2

parent ** ps =(parent **)malloc(sizeof(parent *)* NUM); – cppguy 2013-04-23 00:43:22

+0

更重要的是,不要使用malloc ...只是有一个像这样的成员静态std :: vector p; – cppguy 2013-04-23 00:47:21

+0

并记住C++不是垃圾收集语言......对于每个malloc都必须有一个免费的,因为每个新的都必须删除 – cppguy 2013-04-23 00:50:07

回答

0

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

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

然后,当你使用的衍生方法P,你知道,p是真的派生类型,你可以安全地投放。

+0

是的,但是然后我在每个方法中都有一个转换(原则上这是不必要的)它会引入开销代码非常关键。在各地都有dynamic_casts也不是很好 – hlitz 2013-04-23 02:33:08

+0

你可以*安全地*施放它 - 使用C风格的演员。你已经保证它是一个有效的演员,并且你不需要dynamic_cast的开销 – krsteeve 2013-04-23 04:17:04

+0

说到这一点,你可能想重新考虑你的设计。考虑查看一些设计模式,如复合模式。 http://en.wikipedia.org/wiki/Composite_pattern – krsteeve 2013-04-23 04:23:28