簡體   English   中英

從基類的向量訪問繼承的類方法

[英]Accessing inherited class methods from vector of base class

我有一個基類和幾個繼承的類。

class Base {
public:
void update();
};

class Inherited1 {
public:
void update(); // override base method
};

class Inherited2 {
public:
void update(); // override base method
};

我有一個基類的向量,其中包含指向多個子類實例的指針,即

vector<Base> myObjects;
Base *i1 = new Inherited1();
Base *i2 = new Inherited2();
myObjects.push_back(*i1);
myObjects.push_back(*i2);

我希望能夠遍歷向量中的每個元素並自動調用子類(即重寫)方法,例如:

for (int i=0; i<myObjects.size(); i++) {
    (*myObjects[i]).update();
}

但這是行不通的,它只是調用超類方法。 實現此目標的正確方法是什么?

您必須聲明公共繼承,然后將成員聲明為虛擬

class Base {
public:
virtual void update();
};

class Inherited1: public Base{
public:
virtual void update(); // override base method
};

class Inherited2: public Base{
public:
virtual void update(); // override base method
};

代碼段不得編譯。 這個

vector<Base> myObjects;

不是指向基類對象的指針的向量。 它是基類對象的向量。

您需要將向量定義為

vector<Base *> myObjects;

至於功能更新,則必須在基類中將其定義為虛擬

virtual void update();  

只有在這種情況下,才會有類的多態層次。

我認為派生類的定義有錯別字。 應該有

class Inherited1 : public Base

代替

class Inherited1 

您的設計幾乎是好的,但是您需要在Base類中聲明virtual ()(如果使用C ++ 11,則可以使用新的“ override”關鍵字標記覆蓋方法)。

沒有“ virtual”關鍵字,就不會發生多態(您只是在每個子類中重新聲明和隱藏“ update”)

#include <iostream>
#include <vector>
using namespace std;

class Base{
public:
    virtual void update(){
        cout << "base" << endl;
    }
};

class Inherited1: public Base {
public:
    void update(){
        cout << "Inherited1" << endl;
    }
};

class Inherited2: public Base {
public:
    void update(){
        cout << "Inherited2" << endl;
    }
};

int main()
{
    vector<Base*> myObjects;
    Base *i1 = new Inherited1();
    Base *i2 = new Inherited2();
    myObjects.push_back(i1);
    myObjects.push_back(i2);
    for (auto iter = myObjects.begin(); iter != myObjects.end(); ++iter)
    {
        (*iter)->update();
    }
}

輸出是

Inherited1
Inherited2

暫無
暫無

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

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