指向派生类的递增指针
Incrementing pointer to a derived class
我正在为指向派生类的指针编写一个程序。这是我的代码,
#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++;
正在递增指针以指向类基类型的下一个对象,而不是派生类类型 我们可以通过写来正确显示答案 但是我们必须分配2个指针。类似地,如果我们必须取100个值,那么我们必须分配100个指针。这不好。 我的问题是,我们可以用单指针显示数组的值吗?> bp =& d[0];
bp1=&d[1];
d[0].set_i(1);
d[1].set_i(2);
我想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的真正问题,我想这会解决它。
你不能做你想做的事。
您正在创建一个具有派生大小的对象数组。当您使用指向数组的基指针时,您正试图按基的大小移动指针。如果你有一个Derived*数组,那么你可以用一个基数**指向它们,一切都会正常工作。如果有实际对象,则必须使用正确的数据类型。
想要实现这一点的唯一原因是利用基类的多态特性。多态性只在指针和refrecnes上起作用,所以存储实际对象对你来说几乎没有什么好处。
如果您坚持使用基类指针来指向派生类,则不能使用++进行迭代。你应该这样做:
bp = d;
.
.
.
bp = &d[1];
在C/C++/ObjectiveC中,大小总是隐含的。对于单个类型,编译器知道它的大小,同样,它只通过指针的类型来知道指针指向的对象的大小。因此,递增指针总是将编译时间常数添加到指针;它不会有什么不同,因为在内存中的任何地方都没有存储大小这样的东西。因此,无论何时将指针从一个类投射到另一个类,都不能再对其使用指针算术,否则会出现未定义的行为。
作为一个解决方案,使用ShighShagh的答案,并使用一组指针。
- 在C++中,可以使用指针作为数组来存储不同类型的对象
- 要创建数组指针,只需声明指针变量并使用MALLOC或NEW分配内存。所以你会
- 碱基*bp=(碱基*)malloc(sizeof(10)/sizeof(碱基))
- 这将创建一个大小为10的指针数组。然后可以使用此指针来存储基础对象或派生对象。您还可以使用for循环来遍历10个元素的指针
- 为什么使用 "this" 指针调用派生成员函数?
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如果基类包含双指针成员,则派生类的构造函数
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 指向基类派生类的 std::unique_ptr 的指针
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- 从基指针到派生的强制转换问题
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 从基类指针派生派生类的模板类型
- 指向从指针派生类成员函数的指针,指向基类成员函数
- 访问通过指针派生的类
- 如果未使用虚拟函数,则使用基类指针派生类的任何目的
- 从基指针C++派生类的类型
- 无法从指针派生类转换为指针基类(多态性)
- C++ - 传递智能指针派生类