递增指向派生类的指针

Fre*_*911 5 c++

我正在编写一个指向Derived类的指针的程序.这是我的代码,

 #include <iostream>
    using namespace std;

    class base {
      int i;
    public:
      void set_i(int num) { i=num; }
      int get_i() { return i; }
    };

    class derived: public base {
      int j;
    public:
      void set_j(int num) {j=num;}
      int get_j() {return j;}
    };

    int main()
    {
      base *bp;
      derived d[2];

      bp = d;

      d[0].set_i(1);
      d[1].set_i(2);

      cout << bp->get_i() << " ";
      bp++; 
      cout << bp->get_i(); 

      return 0;
    }
Run Code Online (Sandbox Code Playgroud)

该程序显示1个正确的值和其他垃圾值,因为

BP ++;

将指针递增以指向类基类型的下一个对象,而不是类派生类型.

我们可以通过写作正确地显示答案

> bp =& d[0];   
bp1=&d[1];  
 d[0].set_i(1);  
 d[1].set_i(2);
Run Code Online (Sandbox Code Playgroud)

但是我们必须分配2个指针.同样,如果我们必须取100个值,那么我们必须分配100个指针.这不好.

我的问题是,我们可以用单指针显示数组的值吗?

Nic*_*rca 6

我想象OP试图这样做的原因是他可以拥有一个对象数组,这些对象可以是某些基类的任意派生实例,并迭代它们.如果是这种情况,您确实需要一个指向基类的指针数组.就像是:

class Base { /* ... */ };
class Derived1 : public Base { /* ... */ };
class Derived2 : public Base { /* ... */ };

// ...

Base *arr[10] = {new Derived1(), new Derived1(), new Derived2(), ...};

// ...

for(Base **p = arr; p < arr+10; ++p) {
  *p->foo();
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果我猜到了OP的真正问题,我想这会解决它.

  • 虽然向量会很好; 我建议实际上学习如何管理你的记忆,因为你在开始使用智能指针之前学习语言.有两个原因:1.当你使用它们时,你会很好地欣赏它们2.你会明白它们为你照顾的是什么.即在使用计算器为您找出答案之前学习微积分.在每个问题上抛出大量的第三方解决方案都是不仅仅需要,而且只会让那些不知道自己还在做什么的人的调试变得复杂化. (2认同)