簡體   English   中英

將繼承的類類型作為參數傳遞

[英]Passing inherited class type as argument

將繼承的類類型作為參數傳遞給采用其基類類型的方法時,我遇到了問題。

class Base {...}
class Derived : public Base {...}
class Container {
    vector<Base*> cont; //1
 public:
    void addToCont(Base x) { //2
        cont.push_back(&x);
    }
}

int main() {
   Container c;
   c.addToCont(Derived(p1,p2)); //3
}

1)我想我需要有一個指向對象的指針容器以使其正常工作

2)這是從派生到基數轉換中的錯誤

3)我不應該更改此電話。 我試過了

Derived d(p1,p2);
c.addToCont(d);

addToCont(Base& x)

它為我工作。

我的問題是我有3個派生類,並且我不想3次重載add方法。 我想我將不得不向這些類添加一些虛擬方法或類型轉換,但是我對此一無所獲。 我是繼承的新手,對此感到很困惑。 感謝你的幫助。

當派生類是引用或指針時,它們才“可能使用”。 如果將一個類轉換為沒有引用或指針的基類,則以后將無法將其用作派生類。

如果您實際上是在容器中存儲指針,那么我將使其明確,因此:

class Container {
    vector<Base*> cont;
 public:
    void addToCont(Base* x) { 
        cont.push_back(x);
    }
    ~Container()
    {
       for(auto a : cont)
       {
           delete a;
       }
    }
}

而在主要方面:

容器c; c.addToCont(new Derived(p1,p2));

請注意,在您的原始代碼中,在調用addToCont(...)之后, Derived(p1, p2)將再次被銷毀,因此您的數組將指向Derived類的“ dead”元素。 這可能不是您真正想要的(因為使用該元素是不確定的行為,並且建立一個裝有無用元素的容器是毫無意義的)

一些注意事項:

  1. 必須使用指向Base的指針向量,以便可以處理層次結構中的對象。 不用說,使用某種智能指針而不是原始指針可能會更好,但這會帶來偏好,以及您有多愛冒險。
  2. 使用void addToCont(Base x)是錯誤的,因為即使您僅添加Base對象,也將添加指向局部變量的指針(傳遞值參數)
  3. 使用void addToCont(Base &x)來處理本地Derived d也是錯誤的,由於與以前相同的原因,一旦d超出范圍,您將剩下一個懸空的指針,該指針存儲在指針中
  4. 調用addToCont(Derived(...))會傳遞一個臨時對象。 在考慮內存管理時,必須考慮到這一點。
  5. 不知道為什么會看到需要為所有派生類重載addToCont,這與您在void addToCont(Base &x)void addToCont(Base &x)
  6. 解決方案(如果您保留原始指針)是使void addToCont(Base *x) ,您可以在其中傳遞指向Base或任何Derived的指針。 同樣,您必須注意內存管理。 您可能需要為您的派生對象分配一個new Derived(...)並且您必須注意誰擁有它,以及誰負責刪除它(例如,當Container對象被銷毀時)。
  7. 您可能應該記住使虛擬對象成為Base的析構函數,因為您將破壞Base指針中的Derived對象,並且如果析構函數不是虛擬的,則對象將僅被部分破壞。

如果絕對需要進行addToCont(Derived(...))調用,那么您可能要考慮使用void addToCont(Base &x)定義...。但是,您必須先克隆對象,然后才能將其插入向量中:

void addToCont(const Base &x) { //2
    cont.push_back(x.clone());
}

但是,然后..您需要一個virtual Base *clone() const方法(至少)在Derived類中實現,該方法將生成一個Base指針,其中包含Derived對象的精確副本,包括對象的額外副本和額外內容。克隆...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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