同一基类的两个派生对象如何通信

同一基类的两个派生对象如何通信

我有以下情况

class B {
public:
    B() {};
    virtual ~B() {};
    virtual void seti( int x ) { i = x; };
    virtual void setj( int x ) { j = x; };
    virtual void add() =0;

protected:
    int i;
    int j;
};
class D :  public B {
public:
 virtual void add() { cout << "D-add:" << i + j << endl; };
};

class E: public B {
public:
    void seti( int x ) { i = x; };
    void add() { cout << "E-add:" << i + j << endl; };
    void mult() { cout << "E-mult:" << i * j << endl; };
};

int _tmain(int argc, _TCHAR* argv[])
{
    D *d = new D();
    d->seti(4); d->setj(5); d->add();
    E*e = d;
    e->seti(8); e->add(); e->mult();
    return 0;
}

我收到以下错误
1>。\ CallBack.cpp(38):错误C2440:“正在初始化”:无法从“D *”转换为“E *”
1>指向的类型不相关;转换需要reinterpret_cast,C样式转换或函数样式输入代码

我想做的是实例化E时,我使用了D的所有信息/成员并对其进行了更多处理。我应该像上面那样使用分层继承,还是应该使用多级继承,或者还有其他更好的方法。请指教。谢谢 !

最佳答案

我认为您想要的是“转换ctor”-E上的构造函数,该构造函数将对D的引用/指针作为参数并根据D的值填充自身。要复制在B上定义的字段,可以执行以下操作:

class B {
public:
....
  B(B& source) { this->i = source.i; this->j = source.j; }
....
}
class E {
public:
....
  E(D& source) : B(source) { // no need to do anything about i,j
  }
....
}

另外,您可以编写一个转换器类(DtoEConverter),该类具有执行该功能的功能。

关于c++ - 同一基类的两个派生对象如何通信?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10920120/

10-10 21:38