我有以下情况
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的所有信息/成员,并用它做更多的事情。我应该像上面那样使用层次继承,还是应该使用多级继承,还是有其他更好的方法。请指教。谢谢!
答案 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;
}
很难给出代码,因为我不确定你想要实现什么,给出你的例子。