在c ++中是否可以指向不同类型的指针?

时间:2009-10-16 18:57:11

标签: c++ arrays pointers

在c ++中是否可以使用不同类型的指针数组? 请举例说明)

7 个答案:

答案 0 :(得分:15)

通常,如果您希望拥有不同“类型”指针的集合,则可以通过它们派生出基类/接口并存储指向该基类的指针来实现它。然后通过多态,你可以让它们表现为不同的类型。

class Base
{
public:
    virtual void doSomething() = 0;
};

class A : public Base
{
    void doSomething() { cout << "A\n"; } 
};

class B : public Base
{
    void doSomething() { cout << "B\n"; } 
};

std::vector<Base*> pointers;
pointers.push_back(new A);
pointers.push_back(new B);

答案 1 :(得分:8)

已经提到了一个指向void的指针数组。如果你想让它变得实用和有用,可以考虑使用boost::any的数组(或更好的矢量)。

答案 2 :(得分:6)

C ++是C的东西更多。因此,如果您想以C方式执行,如上所述,您只需创建一个void指针数组

void *ary[10];
ary[0] = new int();
ary[1] = new float();

DA。

如果你想以面向对象的方式做事,那么你想要使用一个集合,并将你要添加到集合中的所有东西派生自可以添加到集合中的相同基础对象类。 在java中,这是“对象”,C ++没有内置的基础对象,但是你使用的任何集合库都有你可以子类化的东西。

答案 3 :(得分:4)

...如果你使用void *,那很容易; - )

答案 4 :(得分:3)

是。两种方式:

•指向基类类型的指针,指向从该基类型派生的类型的对象 •无类型void *指针,必须手动转换为它们指向的实际对象类型。

第一种方法是标准的面向对象编程。

第二种方法对于低级编程(例如,设备驱动程序,内存管理库等)非常有用,并且被认为是危险的,并且仅适用于准确知道他们正在做什么的程序员。显然,它需要额外的簿记信息来告诉你每个指针的实际类型是什么。

答案 5 :(得分:1)

是;只需将数组中的指针转换为您希望它们引用的任何类型。

或者,你可以使你的数组​​成为一个联合数组(union元素是不同的指针类型)。

答案 6 :(得分:0)

#include <stdio.h>

int main(void)
{
  void * ptr[2];
  int *a;
  int b;

  ptr[0] = "[0] = \"This is a string & c does it better\", [1] = ";
  *a = 2;
  ptr[1] = a;
  b = *((int *) ptr[1]);
  printf("%s",  (char *) ptr[0] );
  printf("%i\n", b );

  return 0;
}