2

我想模拟面向对象的编程,所以在 C++ 中,让我们考虑以下 C 代码:

typedef struct tAnimal{
   char * name;
   int age;
}tAnimal;

typedef struct tAnimal2{
   char * name;
   int age;
   float size;
}tAnimal2;   

在 C++ 中,您可以创建从同一类继承的不同对象的表。我想在 C 中做同样的事情,让我们考虑以下代码:

tAnimal ** tab;
tab = malloc(sizeof(tAnimal*)*2);
tab[0] = malloc(sizeof(tAnimal));
tab[1] = malloc(sizeof(tAnimal2));

请注意,分配是有效的,因为 malloc 返回一个 void 指针,而 C 不需要强制转换。但是我仍然无法访问 size 字段,因为选项卡元素的类型毕竟是 tAnimal 。

有没有办法解决这个问题?,我想远离 void ** 指针。

4

3 回答 3

3

在 C 中,通常使用带有类型标志和union数据的结构:

typedef enum
{
    Animal1,
    Animal2
} AnimalType;

struct Animal
{
    AnimalType type;

    union
    {
        tAnimal  animal;
        tAnimal2 animal2;
    };
};

现在您可以创建一个结构数组Animal

于 2013-01-19T15:22:52.287 回答
0

如果你想访问 size 字段,你必须将指针转换为 tAnimal2。请注意,对于 C++ 也是如此。

您可以通过在第二个结构的开头嵌入第一个结构来模拟继承:

struct tAnimal{
   char * name;
   int age;
};

struct tAnimal2{
  struct tAnimal parent;

  float size;
};
于 2013-01-19T15:22:43.470 回答
0

为了访问该size字段,tab[1]您可以将指针转换为 tAnimal2 指针。

 tAnimal2* panimal2 = (tAnimal2*) tab[1];
 panimal2->size = 1.0;

然而,这种做法很容易导致数据损坏,因为您需要一种方法来确保您转换为 tAnimal2 的表元素确实是 tAnimal2 的一个实例。您可以使用 Joachim Pileborg 建议的附加类型字段来检查对象的类型。

于 2013-01-19T15:32:58.067 回答