我從來沒有使用多重繼承,但最近閱讀它時,我開始考慮如何在代碼中實際使用它。當我使用多態通常我通常通過創建聲明爲基類指針新衍生的實例使用諸如你如何實現多繼承的多態行爲?
BaseClass* pObject = new DerivedClass();
,讓我在派生類中調用虛函數時,得到正確的多態行爲。通過這種方式,我可以擁有不同多態類型的集合,通過它們的虛擬功能來管理自己的行爲。
當使用多重繼承考慮,我在想同樣的做法,但我會怎麼做,如果我有以下層次
class A {
virtual void foo() = 0;
};
class B : public A {
virtual void foo() {
// implementation
}
};
class C {
virtual void foo2() = 0;
};
class D : public C {
virtual void foo2() {
// implementation
}
};
class E : public C, public B {
virtual void foo() {
// implementation
}
virtual void foo2() {
// implementation
}
};
這個層次,我可以創建E類作爲一個新的實例
A* myObject = new E();
或
C* myObject = new E();
或
E* myObject = new E();
但如果我聲明它爲A*
那麼我將失去C和D繼承層次的多態性。同樣,如果我將其聲明爲C*
,那麼我將失去A和B類多態性。如果我聲明它爲E*
那麼我不能以我通常所做的方式獲得多態行爲,因爲不通過基類指針訪問對象。
所以我的問題是什麼解決這個? C++是否提供了一種可以解決這些問題的機制,或者必須將指針類型在基類之間來回轉換?當然這很麻煩,因爲我不能直接做以下操作
A* myA = new E();
C* myC = dynamic_cast<C*>(myA);
因爲cast會返回一個NULL指針。
爲什麼要將它轉換爲'A *'然後賦值給'C *'? – 2012-08-02 07:14:11
「我實際上可以如何使用它」聽起來好像你只是想因爲可能而試圖使用它。如果有充分的理由,請使用它。 – Alex 2012-08-02 07:14:35
@JoachimPileborg要訪問C類端多態性 – mathematician1975 2012-08-02 07:18:25