2012-07-30 443 views
1

的動態初始化可以說我有以下抽象類實例

class Parent { 
    protected: 
    virtual void overrideMe() = 0; 
} 

class ChildA : public Parent { 
    protected: 
    void overrideMe() = 0{} 
} 

class ChildB : public Parent { 
    protected: 
    void overrideMe() = 0{} 
} 

class UtilClass { 
    public: 
    vector<Parent> planes; 
    void compute() { 
    Parent& p = planes[0]; 
    } 
} 

在這種情況下,我在計算()在UtilsClass錯誤得到,即「父」不能被初始化。

我想要做的是在UtilClass中填充數組「平面」(使用ChildA或childB,即非混合類型)並進行一些計算。

我是否必須在初始化期間使用指針,或者更好地使用模板?我幾乎可以肯定,模板使用不是必要的,因爲我想限制使用的只有父類的孩子。

回答

5

vector<Parent> planes;沒有意義,因爲Parent不能存在。這是一個抽象類。你可以有一個指針向量,或者更好的是,智能指針。

即使Parent不是抽象的,Parent對象的矢量將從對象切片受苦,它可能不是你想要的,因爲它會打破多態性。

class UtilClass { 
    public: 
    vector<Parent*> planes; 
    void compute() { 
    Parent& p = *planes[0]; 
    } 
} 
2

你不能有

vector<Parent> planes; 

因爲你的父類是抽象的,不能被實例化。您將需要使用像

vector<Parent*> planes; 

,而是如果你想有一個由家長用這樣的語法創建派生類對象

Parent* pNewObject = new ChildB; 
planes.push_back(pNewObject) 
+0

感謝派生的對象的矢量編輯 - 意思是說「具有純粹的虛擬功能」 – mathematician1975 2012-07-30 18:19:20