2

我有以下情况

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-style cast 或 function-styl`在此处输入代码`e cast

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

4

5 回答 5

3

你可以改变

class E: public B {

class E: public D {
于 2012-06-06T18:43:14.967 回答
2

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

于 2012-06-06T18:42:11.973 回答
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;

因为d 是一个B

顺便说一句,你的问题标题问:

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

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

 D *d = new D();
于 2012-06-06T18:44:13.937 回答
1

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

您可以潜在地将接口添加到 D 类......比如说接口 IAdd,然后将 D 类传递给 E 类。

因此,在 E 类的构造函数中,您可以使用以下内容: public E(Interface x) .... 传入 D 类而不是 X。

请让我知道这可不可以帮你 :)

问候

于 2012-06-07T09:19:00.130 回答
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;
}

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

于 2013-04-05T18:15:47.117 回答