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

时间:2012-06-06 18:37:59

标签: c++ design-patterns derived-class

我有以下情况

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;
}
I get the following error
1>.\CallBack.cpp(38) : error C2440: 'initializing' : cannot convert from 'D *' to 'E *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-styl`enter code here`e cast

我想要做的是当我实例化E时,我使用了D的所有信息/成员,并用它做更多的事情。我应该像上面那样使用层次继承,还是应该使用多级继承,还是有其他更好的方法。请指教。谢谢!

5 个答案:

答案 0 :(得分:3)

你可以改变

class E: public B {

class E: public D {

答案 1 :(得分:2)

我认为你想要的是一个“转换器” - 一个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),它将具有执行此操作的功能。

答案 2 :(得分:2)

D *d = new D();
d->seti(4); d->setj(5); d->add();
E*e = d;

d是指向D的指针。您无法将指向D的指针指定给带有指针E的变量,因为这些类型不是直接相关的。

它们与基类相关,但d 不是E ,这就是您遇到的问题。

你可以这样做:

B* e = d;

Becasue d B

顺便问一下,你的问题标题是:

  

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

强调我的。您没有两个派生对象 - 您只有一个。有两个类,但是你只能在这里实例化一个实际对象:

 D *d = new D();

答案 3 :(得分:1)

我不是C ++程序员,但我希望尝试根据我们在C sharp中可能做的事情提供替代方案

您可以将接口添加到D类....说接口IAdd然后将D类传递到E类。

所以在E类的构造函数中你可以有类似的东西:public E(Interface x)....传递给D类而不是X.

请告诉我这是否有帮助:)

此致

答案 4 :(得分:1)

不要用类间通信污染你的主类,而是引入一个新类。

class DECommunicator
{
public:
  DECommunicator(D* dPtr, E* ePtr)
  {
    mDPtr = dPtr;
    mEPtr = ePtr;
  }

  void DSetI(int x)
  {
    mDPtr->setI(x);
  }

  // add additional methods to allow D to "talk" to E and vice versa

private:
  D* mDPtr;
  E* mEPtr;
}

很难给出代码,因为我不确定你想要实现什么,给出你的例子。