0

我正在尝试从其基类中创建派生对象的向量。

class Animal
{
 // Do Stuff
}

class Dog : public Animal

{
 // Do Stuff
}

class AnimalKingdom
{
    vector<Animal> animals;
    vector<Dog> getDogs();
}

vector<Dog> AnimalKingdom::getDogs();
{

    vector<Dog*> dogs;        

    for(i = 0; i < animals.size(); i++)
    {
        Animal& a = *animals[i];

        if(typeid(a).name() == "class Dog")
        {
            dogs.push_back(*a);
        }
    }
}

但显然 *a 不是指向狗的指针,所以它不能添加到狗?

那有意义吗?

4

3 回答 3

0

您需要将 cast Animal 输入 Dog。阅读一下 static_cast 和 dynamic_cast 是什么。但通常 static_cast 是如果您知道要转换为哪种类型,而 dynamic_cast 是猜测,如果不是该类型,将返回 null 。

for(i = 0; i < animals.size(); i++)
{
    Animal* a = &animals[i];

    if(typeid(a).name() == "class Dog")
    {
        dogs.push_back(static_cast<Dog>(a));
    }
}

Ps.Im 在工作,所以我无法检查该代码,看起来是正确的 =D

于 2013-02-06T00:57:48.670 回答
0

首先,typeid(a).name()将返回一个特定于编译器的字符串。例如,在我的 gcc 中,返回的字符串会完全不同。另外,想想第三个类,它是 Dog 的子类。你typeid(a).name()会给你“class Chihuahua”,这是一条狗,但不是“class Dog”。

您应该使用 dynamic_cast 来查询对象类型。当您dynamic_cast<Dog*>(a)问“可以正确地将 a 转换为 Dog 吗?”时。如果是,您将有一个 Dog* 类型的指针,如果不是,您将有一个 NULL 指针。

最后,在 处class AnimalKingdom,您的向量将不允许您拥有 Dog 类型的对象。当您创建一个std::vector<Animal>时,您正在创建一个其元素为固定类型的向量sizeof(Animal)。您需要的是使用指针。一个指针指向一个内存地址,而不强制该地址具有任何大小或基类。

只是为了更清楚一点:当你这样做时,Animal a;你正在创建一个类型Animal为 size的变量sizeof(Animal)。当你这样做时,Animal* a你正在创建一个大小为 4 个字节(或 8 个字节)的内存地址,对于任何指针,它都将具有这个大小。因此,Animal* 可能指向与 不同的东西Animal,它可能指向 的子类Animal

这就是静态分配(固定大小)和动态分配(动态大小,但注意指针有固定大小)的区别。

于 2013-02-06T01:10:12.543 回答
0

您的主要问题是要了解您不能向上转换,这会产生空值。您可以将狗贬低为动物并仅使用父母的最小属性,

所以这个问题可以很容易地解决,比如:1-返回向量并使用多态流来做任何你想做的事情。2- 做一些 bool 或 int 来检查或标记动物的种类如下。例如,为狗设为 2,此变量在动物类中定义。然后使用虚函数在运行时动态地转到您想要的任何内容。所以下面的代码对你来说是很好的骨架。

class Animal
{
    int type;
    virtual void setType()=0;
    virtual int getType()=0;
};

class Dog :public Animal
{
    void setType()
    {
        type = 2;
    }
    int gettype()
    {
        return type;
    }
}; 

玩得开心。

于 2013-02-06T11:22:24.070 回答