【问题标题】:Accessing inherited class methods from vector of base class从基类的向量访问继承的类方法
【发布时间】:2014-05-12 07:40:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不应编译代码 sn-ps。这个

      vector<Base> myObjects;
      

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

      你需要将向量定义为

      vector<Base *> myObjects;
      

      至于函数更新则必须在基类中定义为virtual

      virtual void update();  
      

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

      我认为派生类的定义有错别字。应该有

      class Inherited1 : public Base
      

      而不是

      class Inherited1 
      

      【讨论】:

      • 代码编译——但在插入时隐式复制(!)值的 Base 部分。
      • @Jonas Wielicki 无法编译代码,因为 this (*myObjects[i]).update();语法无效。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        #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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-15
          • 2017-05-23
          • 2017-09-05
          • 1970-01-01
          • 2014-04-19
          相关资源
          最近更新 更多