[英]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”元素。 這可能不是您真正想要的(因為使用該元素是不確定的行為,並且建立一個裝有無用元素的容器是毫無意義的)
一些注意事項:
void addToCont(Base x)
是錯誤的,因為即使您僅添加Base對象,也將添加指向局部變量的指針(傳遞值參數) void addToCont(Base &x)
來處理本地Derived d
也是錯誤的,由於與以前相同的原因,一旦d
超出范圍,您將剩下一個懸空的指針,該指針存儲在指針中 addToCont(Derived(...))
會傳遞一個臨時對象。 在考慮內存管理時,必須考慮到這一點。 void addToCont(Base &x)
上void addToCont(Base &x)
void addToCont(Base *x)
,您可以在其中傳遞指向Base或任何Derived的指針。 同樣,您必須注意內存管理。 您可能需要為您的派生對象分配一個new Derived(...)
並且您必須注意誰擁有它,以及誰負責刪除它(例如,當Container對象被銷毀時)。 如果絕對需要進行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.