如何迭代某个派生类的基础对象

时间:2014-06-06 11:38:16

标签: c++

假设我已经实施了以下课程

class A
{
   public:
      virtual void printA() 
      { 
         cout << "Hi from A!" << endl; 
      }
};

class B : public A
{  
   public:
      virtual void printB() 
      { 
         cout << "Hi from B!" << endl; 
      }
};

class C : public B
{
   public:
      void printC() 
      { 
         cout << "Hi from C!" << endl; 
      }
};

让我们说我已经创建了一个std::vector<A *> vec,它包含从A,B和C实例化的随机数量的对象。现在让我说我被迫遍历vec中的所有对象但只是调用具有printC()方法的对象(即C个实例)。这样做的最佳方式是什么?

int main()
{
    std::vector<A *> vec;

    ....
    // insert random objects from both A, B and C into vec
    ....

    for(vector<A *>::iterator x = vec.begin();
        x != vec.end();
        x++)
    {
       if(dynamic_cast<C *>(*x) != 0)   // 1. is this OK?
         (*x)->printC();
       else
         (*x)->printA();                // 2. is this also OK?

    }
}
  1. 1好吗?如果是这样,这是最佳做法?

  2. 在C实例的情况下,2会导致问题吗?

  3. 也许这些都是愚蠢的问题,但我对C ++很陌生,而且多态在C ++中是如何工作的对我来说非常奇怪。感谢

2 个答案:

答案 0 :(得分:3)

我认为你的意思是以下

#include <iostream>
#include <vector>


int main() 
{
    class A
    {
    public: 
        virtual ~A() = default;
        virtual void print() const 
        { 
            std::cout << "Hi from A!" << std::endl; 
        }
    };

    class B : public A
    {  
    public: 
        void print() const
        { 
            std::cout << "Hi from B!" << std::endl;
        }
    };

    class C : public B
    {
    public:
        void print() const 
        { 
            std::cout << "Hi from C!" << std::endl; 
        }
    };

    std::vector<A *> v = { new A(), new B(), new C() };

    for ( A *p : v ) p->print();

    return 0;
}

输出

Hi from A!
Hi from B!
Hi from C!

答案 1 :(得分:2)

1赢了,因为*x的类型为A*,而A没有printC成员。它应该是:

if (C * c = dynamic_cast<C *>(*x)) {
    c->printC();
}

2很好,但与您的描述不符;你说你想要&#34;只调用具有printC()方法&#34;的对象,而在其他对象上调用printA()

这确实看起来像一个奇怪的设计;你通常会定义一个虚拟函数,由每个类实现为该类做正确的事情,然后无条件地调用它。