2012-06-06 35 views
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; 
} 
 
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

'E'不是來自'D' –

+0

像靜態成員? http://stackoverflow.com/questions/1390913/are-static-variables-in-a-base-class-shared-by-all-derived-classes – corn3lius

回答

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),這將有一個函數來做到這一點。

+0

同意轉換構造函數是一種方式...但這會迫使我編寫一些函數,如「int getj(){return j;}」。除了不寫任何「get」函數外,還有什麼辦法嗎? – Amol

+0

當然有......在B上定義一個「copy ctor」,然後在E上從你的轉換ctor中調用它。在B的副本中,你的i和j可以直接複製,而不需要獲取函數。 –

+0

你能否給我一個示例代碼?將不勝感激...感謝您的回覆 – Amol

3

你可以改變

class E: public B { 

class E: public D { 
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 dB

順便說一句,你的問題的標題問:

如何得出相同的基類的對象進行溝通?

強調我的。你沒有兩個派生的對象 - 你只有一個。有兩類,但你永遠只能實例化一個實際的對象,在這裏:

D *d = new D(); 
+0

謝謝!我稍微更新了上面的代碼。我想使用'd'中保存的所有數據並執行另一個操作(比如上面編輯的代碼中的乘法)。 – Amol

1

我不是一個C++程序員不過,我想嘗試,並提供基於我們可能會在升C

做替代

您可能會添加接口到D類....說接口IAdd,然後傳遞類D到類E.

因此,在類E的構造函數中,你可以有這樣的東西:公共E(接口x)。 ...傳入D類而不是X.

請讓我知道如果這有助於:)

問候

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; 
} 

很難給出代碼,因爲我不確定你想要實現什麼,舉個例子。

相關問題