从基类的向量访问继承的类方法

时间:2014-05-12 07:40:59

标签: c++ inheritance

我有一个基类和几个继承的类。

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();
}

但这不起作用 - 它只调用超类方法。实现这个目标的正确方法是什么?

4 个答案:

答案 0 :(得分:4)

您必须声明公共继承,然后将memvbers声明为虚拟

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
};

答案 1 :(得分:4)

不得编译代码片段。此

vector<Base> myObjects;

不是指向基类对象的指针的向量。它是基类对象的向量。

您需要将矢量定义为

vector<Base *> myObjects;

对于功能更新,必须在基类

中将其定义为虚拟
virtual void update();  

只有在这种情况下才会有类的多态层次结构。

我认为派生类的定义存在拼写错误。应该有

class Inherited1 : public Base

而不是

class Inherited1 

答案 2 :(得分:1)

您的设计几乎不错,但您需要在Base类中声明update()虚拟(如果使用C ++ 11,您可以使用新的'覆盖'标记覆盖方法关键字)。

如果没有“virtual”关键字,就不会发生多态(你只是在每个子类中重新声明并隐藏“update”)

答案 3 :(得分:1)

#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