2016-02-14 25 views
1

的虛方法,我有以下設置:調用未知的子類

class Parent { 
    virtual void foo(int x) = 0; 
}; 
class Son : public Parent { 
    void foo(int x) {}; 
}; 
class Daughter : public Parent { 
    virtual void foo(int x) {}; 
}; 

如果我有vector<Parent> parents,我會雖然有環矢量如下所示:

for (int i = 0; i < parents.size(); i++) { 
    Parent s = parents[i]; 
    s.foo(-1); 
} 

如何我打電話給孩子們(他們可能是兒子或女兒)嗎?目前我得到兩個錯誤:

  1. Variable type 'Parent' is an abstract
  2. Variable type 'Parent' is an abstract class
+0

@Barry修正了在我的問題中只是一個錯字而不是真正的代碼的派生。 – Bren

回答

1

首先,你必須作出SonDaughter得出的Parent類:

class Son : public Parent { 
    ... 
}; 
class Daughter : public Parent { 
    ... 
}; 

然後,有一個多態對象的向量,你不能在其中存儲對象。你必須獲取指向對象的指針向量才能工作。

vector<Parent*> parents; 

或更好:

vector<shared_ptr<Parent>> parents; 

爲什麼?

  • 否父對象可以被實例化,因爲它是一個抽象類。你只能創建它的派生類。
  • 如果父母不是抽象的,你的代碼可以工作,但是通過將一個兒子或女兒放入向量中,它將是sliced
+0

我剛剛離開了:公共父母的一部分。現在修復。 – Bren