我正在编写一个指向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;
}
程序正在显示1个正确值和其他垃圾值,因为
BP ++;
将指针递增以指向类基类型的下一个对象,但不是类派生类型。
我们可以通过写
来正确显示答案> bp =& d[0];
bp1=&d[1];
d[0].set_i(1);
d[1].set_i(2);
然后我们必须分配2个指针。同样,如果我们必须取100个值,那么我们必须分配100个指针。这不好。
我的问题是我们可以通过单指针显示数组的值吗?
答案 0 :(得分: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();
// ...
}
如果我猜到了OP的真正问题,我想这会解决它。
答案 1 :(得分:3)
你无法做你想做的事。
您正在创建一个派生大小的对象数组。当您使用指向数组的基指针时,您试图按指针的大小移动指针。如果你有一个Derived *数组,那么你可以用一个基数* *指向它们,一切都会起作用。如果您有实际对象,则必须使用正确的数据类型。
您希望实现此目的的唯一原因是利用基类的多态特性。多态性只适用于指针和refrecnes任何方式,因此存储实际对象很少。
答案 2 :(得分:2)
如果您坚持使用基类指针来指向派生类,则不能使用++进行迭代。你应该这样做:
bp = d;
.
.
.
bp = &d[1];
答案 3 :(得分:1)
在C / C ++ / ObjectiveC中,大小总是隐含的。对于单一类型,编译器知道它的大小,同样它知道指针指向的对象的大小仅由该指针的类型。因此,递增指针总是向指针添加 compile 时间常量;它不可能是不同的,因为在内存中的任何地方都没有存储大小的东西。因此,无论何时将指针从一个类转换为另一个类,都不能再使用指针算法,否则会得到未定义的行为。
作为解决方案,请使用ShighShagh的答案并使用一系列指针。
答案 4 :(得分:1)