[英]C++ inheritance problem
這是我的課程:
ParentClass,ParentObj
DerivedClass(繼承自ParentClass),DerivedObj(繼承自ParentObj)。
ParentClass有一個受保護的成員:
std :: vector <ParentObj *>
DerivedClass僅將DerivedObj *對象分配給此向量。
問題是:
當我使用ParentClass時,我想使用類型的迭代器訪問其矢量對象:
std :: vector <ParentObj *> :: const_iterator
當我使用DerivedClass時,我想使用類型的迭代器訪問其矢量對象:
std :: vector <DerivedObj *> :: const_iterator
我怎樣才能使它工作?
您可以在DerivedClass
類中使用虛擬覆蓋,返回ParentClass
返回類型的子類型...
struct ParentClass {
virtual ParentObj* get( const size_t index ) {
return m_objects[index];
}
};
struct DerivedClass : public ParentClass {
virtual DerivedObj* get( const size_t index ) {
return dynamic_cast<DerivedObj*>( ParentClass::get(index) );
}
};
兩個函數都是相同的'vtable'條目,盡管它們的返回類型不同。
或者,您可以使用相同的技術來創建“繼承的”迭代器。
DerivedClass
,在DerivedClass
對象中有一個DerivedObj*
的向量並不是一個壞主意,只要你保證它們也存在於ParentClass
的向量中。
我有一個問題: 為什么DerivedClass
繼承自ParentClass
?
您是否需要多態行為,或者您是否要重用ParentClass
的實現?
繼承經常被嚴重濫用。 真。
然后是(典型的)具有容器類的問題,以及如何公開其元素。 不幸的是,迭代器(盡管他們所有的商品)語言支持得不好,不像他們應該模仿的指針。
因此,提醒: 繼承是一種is-a的關系,代碼重用有成分 。
在這里,您可以完美地編寫一個模板類,它將扮演容器的一部分並提供常用方法。
然后,對於公開的問題......你可以編寫自己的迭代器,使用正確的基礎派生關系,或者你可以選擇預先選擇一些與用戶提供的謂詞一起使用的算法( sort
, foreach
, erase_if
) 。
template <class Value>
class Container
{
public:
template <class Pred>
void sort(Pred iPred);
template <class Pred>
Pred foreach(Pred iPred); // maybe a const-version ?
template <class Pred>
size_t erase_if(Pred iPred); // returns the number of erased
private:
std::vector<Value> m_data;
};
然后,你的課程:
class ParentClass
{
public:
virtual void foo() const;
private:
Container<ParentObj*> m_data;
};
class DerivedClass: public ParentClass
{
public:
virtual void foo() const;
private:
Container<DerivedObj*> m_data;
};
嘗試將多態性與代碼重用分開,問題應該變得更簡單。
std::vector< ParentObj* >
和std::vector< DerivedObj* >
是兩個完全不同的類型,因此您不能隱式地將一個轉換為另一個。 你可以做的是使用dynamic_cast
將每個ParentObj*
轉換為DerivedObj*
。 但一般來說,這不是一個好習慣。
你不能使用基本的C ++繼承來做到這一點。 原因是編譯器在DerivedClass
使用時不知道向量僅包含指向DerivedObj
指針。 關於動態演員的第二個Naveens聲明。
你可以使用兩個向量std::vector< ParentObj* > mParent
和std::vector< DerivedObj* > mDerived
和一個虛擬的Add()
函數。 基本實現只會添加到mParent
。 DerivedClass
的Add
函數也會添加到mDerived
。
ParentClass
有一個GetParentIterator()
函數, DerivedClass
有另一個(附加)函數GetDerivedIterator()
。
你的繼承設計是錯誤的。
DerivedClass
不能從ParentClass
繼承。 ParentClass
有一個受保護的成員std::vector< ParentObj* >
。 DerivedClass
必須有另一個受保護的成員std::vector< DerivedObj* >
。
您可以創建模板類
template<class T>
struct MyClass {
protected:
std::vector< T* > m_objects;
};
struct ParentClass : MyClass <ParentObj> {};
struct DerivedClass: MyClass <DerivedObj> {};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.