簡體   English   中英

C ++繼承問題

[英]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的關系,代碼重用有成分

在這里,您可以完美地編寫一個模板類,它將扮演容器的一部分並提供常用方法。

然后,對於公開的問題......你可以編寫自己的迭代器,使用正確的基礎派生關系,或者你可以選擇預先選擇一些與用戶提供的謂詞一起使用的算法( sortforeacherase_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* > mParentstd::vector< DerivedObj* > mDerived和一個虛擬的Add()函數。 基本實現只會添加到mParent DerivedClassAdd函數也會添加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM