C++ 递增指向派生类的指针

C++ 递增指向派生类的指针,c++,C++,我正在为一个派生类的指针编写一个程序。这是我的代码 #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; pu

我正在为一个派生类的指针编写一个程序。这是我的代码

 #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;
    }
但是我们必须分配2个指针。同样,如果我们必须取100个值,那么我们必须分配100个指针。这不好


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

您不能做您试图做的事情

您正在创建派生大小的对象数组。当您使用指向数组的基指针时,您正试图按基指针的大小移动指针。如果你有一个派生*数组,那么你可以用一个基数**指向它们,一切都会正常工作。如果有实际对象,则必须使用正确的数据类型


您希望实现这一点的唯一原因是利用基类的多态特性。多态性只以任何方式作用于指针和refrecnes,因此存储实际对象的代价很小

若坚持使用基类指针来指向派生类,那个么就不能使用++进行迭代。您应该这样做:

bp = d;
.
.
.
bp = &d[1];

我想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();
  // ...
}
类基类{/*…*/};
类Derived1:公共基{/*…*/};
类Derived2:公共基{/*…*/};
// ...
Base*arr[10]={new Derived1(),new Derived1(),new Derived2(),…};
// ...
对于(基准**p=arr;pfoo();
// ...
}

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

在C/C++/Objective中,大小总是隐式的。对于单个类型,编译器知道它的大小,同样,它只通过指针的类型知道指针指向的对象的大小。因此,递增指针总是向指针添加编译时常量;它不能不同,因为内存中任何地方都没有存储大小这样的东西。所以,无论何时将指针从一个类强制转换到另一个类,都不能再对其使用指针算法,否则会出现未定义的行为

作为解决方案,按照ShighShagh的答案,使用一系列指针。

  • 在C++中,可以使用指针作为数组,存储不同类型的对象。
  • 要创建数组指针,只需声明指针变量并使用MALLOC或NEW分配内存。所以你会有
  • 基*bp=(基*)malloc(sizeof(10)/sizeof(基))
  • 这将创建一个大小为10的指针数组。然后可以使用此指针存储基本对象或派生对象。您还可以使用for循环来迭代10个元素的指针

为什么要使用指向基址的指针而不是指向实际类型的指针?我没听懂。请告诉我更多信息?指针算法是建立在内存地址和类型大小的前提下的。类型大小基于指针的基本类型。这正是你告诉它的。将
指针
bp1
中的地址值按其类型大小(基的大小;而不是派生的大小)前进。如果你想要一个指向第二个元素的指针,你必须找到你想要的元素(例如:
bp1=d+1;
)@MsFreedom911:问题很简单,为什么你要使用
base*
而不是
派生的*
?你已经回答了你自己的问题。如果必须声明并使用bp作为指向基类的指针,则可以通过直接将其索引到数组中来“增加”它:
inti=0。。。bp=&d[i];很高兴听到这个消息。为了完整性,我还建议您使用向量代替普通数组,使用智能指针代替原始指针来防止内存泄漏。虽然我不知道什么是智能指针和向量,因为我刚开始学习C++,我会谷歌的。谢谢advice@MsFreedom911如果您正在学习某种教程,那么希望它能对您有所了解(至少如果它是一个好的教程的话!)。请注意,C++ 03中的智能指针(旧C++标准)是非常不完善的,除非使用像Boost那样的外部库。既然您正在学习,我认为您最好直接学习新标准(C++11)——除非您有令人信服的理由不学习——它具有优秀的内置智能指针。另外,一定要检查。而向量将是好的;我建议你首先学习如何管理你的记忆,因为你是在开始使用智能指针之前学习语言的。原因有二:一,。当你使用它们时,你会正确地欣赏它们。你会明白他们在为你做什么。i、 在使用计算器为你推导答案之前,先学习微积分。对于那些不知道自己在做什么的人来说,仅仅在每个问题上抛出大量第三方解决方案是远远不够的,而且只会使调试变得复杂。@UpAndAdam:他们对汇编代码和编译器说了同样的话,但我先学了一些编译语言,后来又学了x86操作码。
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();
  // ...
}